【资料图】
张量(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 nparr = 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 中的高级索引指的是使用整数数组、布尔数组或者其他序列来访问数组的元素。相比于基本索引,高级索引可以访问到数组中的任意元素,并且可以用来对数组进行复杂的操作和修改。
import numpy as nparr = 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,12,3 1,21,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]]
布尔索引我们可以通过一个布尔数组来索引目标数组。布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
import numpy as nparr = 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 npx = 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]) # 0print(x2[1]) # 6
二维数组import numpy as nparr = 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/numpySciPy 官网:https://www.scipy.org/SciPy 源代码:https://github.com/scipy/scipyMatplotlib 教程:Matplotlib 教程Matplotlib 官网:https://matplotlib.org/Matplotlib 源代码:https://github.com/matplotlib/matplotlib