Python Numpy 切片和索引(高级索引、布尔索引、花式索引)

python,numpy,切片,索引,高级,布尔,花式 · 浏览次数 : 294

小编点评

```python # 传入顺序索引数组 print('arr[[2,0,1]] => ', arr[[2, 0, 1]]) # [[14 15 16 17 18 19 20]] # 传入倒序索引数组 print('arr[[-2,-0,-1]] => ', arr[[-2, -0, -1]]) # [[ 7 8 9 10 11 12 13]] # 传入多个索引数组(要使用 np.ix_) print('arr[np.ix_([1,5,7,2],[0,3,1,2])] => ', arr[np.ix_([1, 0, 2, 1], [0, 3, 1, 2])] # [[ 7 10 8 9]] #相关链接NumPy 官网 print('arr[np.ix_([1,5,7,2],[0,3,1,2])] => ', arr[np.ix_([1, 0, 2, 1], [0, 3, 1, 2])] # [[ 7 10 8 9]] #相关链接Matplotlib 官网 print('arr[np.ix_([1,5,7,2],[0,3,1,2])] => ', arr[np.ix_([1, 0, 2, 1], [0, 3, 1, 2])] # [[ 7 10 8 9]] ```

正文


张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix)
Python Numpy 切片和索引(高级索引、布尔索引、花式索引)
Python NumPy 广播(Broadcast)

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy 应用

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
SciPy 是一个开源的 Python 算法库和数学工具包。
SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。

切片和索引

arr[x][y] = arr[x,y] 两种表达方式

import numpy as np

arr = np.arange(21)  # arange() 函数创建 ndarray 对象
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')
'''
arr[x][y] = arr[x,y]  两种表达方式
冒号 : 的解释:如果只放置一个参数,
如 [2],将返回与该索引相对应的单个元素。
如 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,
如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。
'''
print('arr[1:2] =>', arr[1:2])  # 【1~2] 行,右侧不包含,列全部显示 => [[ 7  8  9 10 11 12 13]]
print('arr[1:] =>', arr[1:])  # 1 行开始,剩下的全部显示,列全部显示 => [[ 7  8  9 10 11 12 13] [14 15 16 17 18 19 20]]
print('arr[:2] =>', arr[:2])  # 取前面两行数据 [[ 0  1  2  3  4  5  6] [ 7  8  9 10 11 12 13]]
print('arr[2][1:6:2] =>', arr[2][1:6:2])  # start:stop:step => 第2行,1~6列,步长2(默认为1)   [15 17 19]
print('arr[2, 1:6:2] =>', arr[2, 1:6:2])  # start:stop:step => 第2行,1~6列,步长2(默认为1)   [15 17 19]
print('arr[:2, 1:6:2] =>', arr[:2, 1:6:2])  # start:stop:step => 前2行,1~6列,步长2(默认为1) [[ 1  3  5] [ 8 10 12]]
print('\n')
'''
切片还可以包括省略号 … ,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
'''
print('arr[1] => ', arr[1])  # 1行,所有列数据 [ 7  8  9 10 11 12 13]
print('arr[1, ...] => ', arr[1, ...])  # 1行,所有列数据 [ 7  8  9 10 11 12 13]
print('arr[..., 3] => ', arr[..., 3])  # 所有行,第3列数据 [ 3 10 17]
print('arr[1] => ', arr[..., 2:])  # 所有行 第3列及剩下的所有元素
print('\n')

高级索引

NumPy 中的高级索引指的是使用整数数组、布尔数组或者其他序列来访问数组的元素。相比于基本索引,高级索引可以访问到数组中的任意元素,并且可以用来对数组进行复杂的操作和修改。

image

import numpy as np

arr = np.arange(21)  # arange() 函数创建 ndarray 对象
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')
'''
高级索引
'''
# 整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
print('arr[[0, 1, 2], [2, 1, 3]] => ', arr[[0, 1, 2], [2, 1, 3]])  # [0,2]、【1,1】、[2,3] => [ 2  8 17]
rows = np.array([[0, 1], [2, 1], [1, 0]])
cols = np.array([[2, 1], [3, 2], [0, 2]])
'''
0,2  1,1
2,3  1,2
1,0  0,2
'''
print('arr[rows, cols] => ', arr[rows, cols])  # [[ 2  8] [17  9] [7  2]]
print('\n')
'''
可以借助切片 : 或 … 与索引数组组合。
'''
print('arr[1:3, 1:4] => ', arr[1:3, 1:4])  # [[ 8  9 10] [15 16 17]]
print('arr[1:3, [1, 4]] => ', arr[1:3, [1, 4]])  # [[ 8 11] [15 18]]
'''
[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]]
'''
print('arr[..., 1:] => ', arr[..., 1:])  # [[ 1  2  3  4  5  6] [ 8  9 10 11 12 13] [15 16 17 18 19 20]]

image

image

image

布尔索引

我们可以通过一个布尔数组来索引目标数组。
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

import numpy as np

arr = np.arange(21)  # arange() 函数创建 ndarray 对象
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')

'''
获取大于 5 的元素
'''
print('arr[arr > 5]', arr[arr > 5])  # [ 6  7  8  9 10 11 12 13 14 15 16 17 18 19 20]

'''
~(取补运算符)来过滤NaN。
'''
arr = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
print('arr[~np.isnan(a)]', arr[~np.isnan(arr)])  # [1. 2. 3. 4. 5.]
'''
从数组中过滤掉非复数元素。
'''
arr = np.array([1, 2 + 6j, 5, 3.5 + 5j])
print('arr[np.iscomplex(arr)]', arr[np.iscomplex(arr)])  # [2. +6.j 3.5+5.j]


花式索引

花式索引指的是利用整数数组进行索引。
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。
对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素,如果目标是二维数组,那么就是对应下标的行。
花式索引跟切片不一样,它总是将数据复制到新数组中。

一维数组

一维数组只有一个轴 axis = 0,所以一维数组就在 axis = 0 这个轴上取值:

import numpy as np

x = np.arange(9) # [0 1 2 3 4 5 6 7 8]
print(x)
# 一维数组读取指定下标对应的元素
print("-------读取下标对应的元素-------")
x2 = x[[0, 6]] # 使用花式索引
print(x2) # [0 6]

print(x2[0]) # 0
print(x2[1]) # 6

二维数组

import numpy as np

arr = np.arange(21)  # arange() 函数创建 ndarray 对象
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')

print('arr[1, [0, 2]] => ', arr[1, [0, 2]])  # [7 9]
print('arr[[0, 2], 1] => ', arr[[0, 2], 1])  # [ 1 15]
print('arr[[0, 2]] => ', arr[[0, 2]])  # [[ 0  1  2  3  4  5  6] [14 15 16 17 18 19 20]]
# 传入顺序索引数组
print('arr[[2,0,1]] => ', arr[[2, 0, 1]])  # [[14 15 16 17 18 19 20] [ 0  1  2  3  4  5  6] [ 7  8  9 10 11 12 13]]

# 传入倒序索引数组
print('arr[[-2,-0,-1]] => ', arr[[-2, -0, -1]])  # [[ 7  8  9 10 11 12 13] [ 0  1  2  3  4  5  6] [14 15 16 17 18 19 20]]
# 传入多个索引数组(要使用 np.ix_)
'''
np.ix_ 函数就是输入两个数组,产生笛卡尔积的映射关系。
笛卡尔乘积是指在数学中,两个集合 X 和 Y 的笛卡尔积(Cartesian product),又称直积,表示为 X×Y,第一个对象是X的成员而第二个对象是 Y 的所有可能有序对的其中一个成员。
例如 A={a,b}, B={0,1,2},则:
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

[1, 0, 2, 1], [0, 3, 1, 2] => (1,0),(1,3),(1,1),(1,2),(0,0),(0,3),(0,1),(0,2)....
'''
print('arr[np.ix_([1,5,7,2],[0,3,1,2])] => ', arr[np.ix_([1, 0, 2, 1], [0, 3, 1, 2])])  # [[ 7 10  8  9] [ 0  3  1  2] [14 17 15 16] [7 10  8  9]]

相关链接

NumPy 官网 http://www.numpy.org/
NumPy 源代码:https://github.com/numpy/numpy
SciPy 官网:https://www.scipy.org/
SciPy 源代码:https://github.com/scipy/scipy
Matplotlib 教程:Matplotlib 教程
Matplotlib 官网:https://matplotlib.org/
Matplotlib 源代码:https://github.com/matplotlib/matplotlib

与Python Numpy 切片和索引(高级索引、布尔索引、花式索引)相似的内容:

Python Numpy 切片和索引(高级索引、布尔索引、花式索引)

[TOC] [张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix)](https://www.cnblogs.com/vipsoft/p/17361876.html) [Python Numpy 切片和索引(高级索引、布尔索引、花式索引)](https://www.

Python NumPy 广播(Broadcast)

张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix) Python Numpy 切片和索引(高级索引、布尔索引、花式索引) Python NumPy 广播(Broadcast) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方

张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix)

张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix) Python Numpy 切片和索引(高级索引、布尔索引、花式索引) Python NumPy 广播(Broadcast) 张量(Tensor):Tensor = multi-dimensional array

NumPy 数组切片及数据类型介绍

NumPy 数组切片 NumPy 数组切片用于从数组中提取子集。它类似于 Python 中的列表切片,但支持多维数组。 一维数组切片 要从一维数组中提取子集,可以使用方括号 [] 并指定切片。切片由起始索引、结束索引和可选步长组成,用冒号 : 分隔。 语法: arr[start:end:step]

Python 潮流周刊#56:NumPy 2.0 里更快速的字符串函数(摘要)

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 本期周刊分享了 12 篇文章,12 个开源项目,赠书 5 本,全文 2100 字。

百度飞桨(PaddlePaddle)-数字识别

手写数字识别任务 用于对 0 ~ 9 的十类数字进行分类,即输入手写数字的图片,可识别出这个图片中的数字。 使用 pip 工具安装 matplotlib 和 numpy python -m pip install matplotlib numpy -i https://mirror.baidu.co

数据分析---numpy模块

前戏 NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。 快捷键的使用: 添加cell:a或者b 删除:x 修改cell的模式: m:修改成markdown模式

【numpy基础】--数组简介

`NumPy`(Numerical Python)是一个`Python`库,主要用于高效地处理多维数组和矩阵计算。它是科学计算领域中使用最广泛的一个库。 在`NumPy`中,**数组**是最核心的概念,用于存储和操作数据。 `NumPy`数组是一种多维数组对象,可以存储相同类型的元素,它支持高效的数

numpy -- 处理数值型数据 -- 数据分析三剑客

博客地址:https://www.cnblogs.com/zylyehuo/ NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。 开发环境 anaconda 集成

NumPy(1)-常用的初始化方法

一、NumPy介绍 NumPy是Python中科学计算的基础包,它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。 功能强大的N维数