2141 字
11 分钟
Numpy学习笔记(2)
NOTE本笔记基于 Jupyter Lab
TIP均从第0个元素开始表述(第0行 / 第0列)
数组访问
一维数组
整数与切片索引
import numpy as nparr = np.arange(10)print('整数索引结果为:', arr[5]) # 索引从 0 开始;也支持负数,`-1` 表示数组最后一个元素print('切片结果为:', arr[2:7]) # 左闭右开,获取从 `start` 到 `end` 的子数组print('省略起始索引结果为:', arr[:5]) # 默认从数组开头开始,获取到索引为 `end-1` 的元素print('省略结束索引结果为:', arr[5:]) # 默认获取到数组末尾,包含索引为 `start` 的元素带步长的切片索引
arr[2:4] = 100, 101print('索引结果为:', arr) # 左闭右开,切片修改数组元素
print('正步长索引结果为:', arr[::2]) # 左闭右开,每隔 2 个元素取一个,组成子数组print('负步长索引结果为:', arr[5:1:-1]) # 反向切片,步长为 -1,数组倒序(开始索引必须大于结束索引)多维数组
import numpy as nparr = np.array([[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11]])print('创建的二维数组为:\n', arr)单维度切片索引
arr[行索引, 列起始索引:列结束索引] 或 arr[行起始索引:行结束索引, 列索引]
print('单维度切片索引结果为:', arr[0, 3:5]) # 左闭右开,索引第0行中第3、4列的元素print('索引结果为:', arr[:, 2]) # 索引第2列的元素多维度切片索引
arr[行起始索引:行结束索引, 列起始索引:列结束索引]
print('多维度切片索引结果为:', arr[1:, 2:]) # 索引第1行及之后行中第2列到最后列的元素print('索引结果为:', arr[:, 1:4]) # 左闭右开,选取所有行中,列索引从 1 到 3 的元素整数序列切片索引
arr[(行索引序列), (列索引序列)]
print('整数序列索引结果为:', arr[(0, 1, 2), (1, 2, 3)]) # 左闭右开,索引第0、1、2行中,第1、2、3列的元素print('索引结果为:', arr[1:, (0, 2, 3)]) # 左闭右开,索引第1行及之后行中,第0、2、3列的元素布尔数组切片索引
arr[布尔数组, 列索引]
mask = np.array([1, 0, 1], dtype=np.bool_) # [True, False, True]print('布尔数组索引结果为:', arr[mask, 2]) # 索引第0、2行中第2列的元素形状操作与展平规则
import numpy as nparr = np.arange(12) # 创建一维数组print('创建的一维数组为:', arr) # [0 1 2 3 4 5 6 7 8 9 10 11]改变数组形状
数组.reshape(shape)
print('新的数组形状为:\n', arr.reshape(3, 4)) # 设置数组的形状为 3x4查看数组维数
数组.ndim / 数组.reshape(shape).ndim
print('数组维数为:', arr.ndim) # 查看数组的维数(轴数)数组展平
- 将多维数组展平为一维数组
import numpy as nparr = np.arange(12).reshape(3, 4)print('创建的二维数组为:\n', arr) # [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]数组.ravel()
# 返回原数组的视图(修改展平后的数组可能会影响原数组)print('数组展平为:', arr.ravel()) # [ 0 1 2 3 4 5 6 7 8 9 10 11]数组.flatten()
# 返回原数组的副本(修改展平后的数组不会影响原数组)# 支持指定展平顺序(默认按行序展平)print('横向展平为:', arr.flatten()) # [ 0 1 2 3 4 5 6 7 8 9 10 11]print('纵向展平为:', arr.flatten('F')) # [ 0 4 8 1 5 9 2 6 10 3 7 11]数组组合
数组元素运算
- 格式示例:
新数组 = 原数组 * 数值(或原数组 + 数值等)
| 运算类型 | 格式示例 | 运算逻辑 | arr1 = np.array([1, 2, 3, 4]) | 运算结果(新数组) |
|---|---|---|---|---|
| 加法 | 新数组 = 原数组 + 数值 | 每个元素加指定数值 | arr1 + 2 | [3, 4, 5, 6] |
| 减法 | 新数组 = 原数组 - 数值 | 每个元素减指定数值 | arr1 - 1 | [0, 1, 2, 3] |
| 乘法 | 新数组 = 原数组 * 数值 | 每个元素乘指定数值 | arr1 * 3 | [3, 6, 9, 12] |
| 除法 | 新数组 = 原数组 / 数值 | 每个元素除以指定数值(结果为浮点) | arr1 / 2 | [0.5, 1.0, 1.5, 2.0] |
| 整除 | 新数组 = 原数组 // 数值 | 每个元素整除指定数值(丢弃小数) | arr1 // 2 | [0, 1, 1, 2] |
| 取余 | 新数组 = 原数组 % 数值 | 每个元素对指定数值取余 | arr1 % 2 | [1, 0, 1, 0] |
| 幂运算 | 新数组 = 原数组 ** 数值 | 每个元素的指定次幂 | arr1 ** 2 | [1, 4, 9, 16] |
| 大于比较(布尔) | 新数组 = 原数组 > 数值 | 每个元素与数值比较,返回布尔值 | arr1 > 2 | [False, False, True, True] |
| 小于比较(布尔) | 新数组 = 原数组 < 数值 | 每个元素与数值比较,返回布尔值 | arr1 < 3 | [True, True, False, False] |
| 等于比较(布尔) | 新数组 = 原数组 == 数值 | 每个元素与数值比较,返回布尔值 | arr1 == 4 | [False, False, False, True] |
| 不等于比较(布尔) | 新数组 = 原数组 != 数值 | 每个元素与数值比较,返回布尔值 | arr1 != 2 | [True, False, True, True] |
数组与数组的逐元素运算(形状需相同)
| 运算类型 | 格式示例 | 运算逻辑 | arr1 = np.array([1,2,3]), arr2 = np.array([4,5,6]) | 运算结果(新数组) |
|---|---|---|---|---|
| 数组加法 | 新数组 = 数组A + 数组B | 对应位置元素相加 | arr1 + arr2 | [5, 7, 9] |
| 数组减法 | 新数组 = 数组A - 数组B | 对应位置元素相减 | arr1 - arr2 | [-3, -3, -3] |
| 数组乘法 | 新数组 = 数组A * 数组B | 对应位置元素相乘(非矩阵乘法) | arr1 * arr2 | [4, 10, 18] |
| 数组除法 | 新数组 = 数组A / 数组B | 对应位置元素相除(结果为浮点) | arr1 / arr2 | [0.25, 0.4, 0.5] |
np.hstack 横向组合数组
- 要求待组合的数组在除水平方向外的其他维度上形状一致
np.hstack((数组1, 数组2, ...))
import numpy as nparr1 = np.array([[1, 2, 3], [4, 5, 6]])arr2 = np.array([[7, 8, 9], [10, 11, 12]])print('横向组合后的数组为:\n', np.hstack((arr1, arr2)))#横向组合后的数组为: #[[ 1 2 3 7 8 9] #[ 4 5 6 10 11 12]]np.vstack 纵向组合数组
- 要求待组合的数组在除垂直方向外的其他维度上形状一致
np.vstack((数组1, 数组2, ...))
print('纵向组合后的数组为:\n', np.vstack((arr1, arr2)))#纵向组合后的数组为: #[[ 1 2 3] #[ 4 5 6] #[ 7 8 9] #[10 11 12]]np.concatenate 组合数组
np.concatenate((数组1, 数组2, ...), axis=轴编号)- 待组合的数组,在除
axis指定的维度外的其他所有维度上,形状必须完全一致axis用于指定数组组合的方向维度axis=1,横向组合(水平方向,列维度方向),与np.hstack类似axis=0,纵向组合(垂直方向,行维度方向),与np.vstack类似
print('横向组合后的数组为:\n', np.concatenate((arr1, arr2), axis=1))#横向组合后的数组为: #[[ 1 2 3 7 8 9] #[ 4 5 6 10 11 12]]print('纵向组合后的数组为:\n', np.concatenate((arr1, arr2), axis=0))#纵向组合后的数组为: #[[ 1 2 3] #[ 4 5 6] #[ 7 8 9] #[10 11 12]]数组分割
arr = np.arange(16).reshape(4, 4)print('创建的二维数组为:\n', arr)#创建的二维数组为: #[[ 0 1 2 3] #[ 4 5 6 7] #[ 8 9 10 11] #[12 13 14 15]]np.hsplit 横向分割数组
- 按照列的维度,将数组平均分割成指定的份数
np.hsplit(数组, 分割份数)
print('横向分割后的数组为:\n', np.hsplit(arr, 2))#横向分割后的数组为:# [array([[ 0, 1],# [ 4, 5],# [ 8, 9],# [12, 13]]), array([[ 2, 3],# [ 6, 7],# [10, 11],# [14, 15]])]np.vsplit 纵向分割数组
- 按照行的维度,将数组平均分割成指定的份数
np.vsplit(数组, 分割份数)
print('纵向分割后的数组为:\n', np.vsplit(arr, 2))#纵向分割后的数组为:# [array([[ 0, 1, 2, 3],# [ 4, 5, 6, 7]]), array([[ 8, 9, 10, 11],# [12, 13, 14, 15]])]np.split 分割数组
np.split(数组, 分割份数, axis=轴编号)axis用于指定数组分割的方向维度axis=1,横向分割(水平方向,列维度方向),与np.hsplit类似axis=0,纵向分割(垂直方向,行维度方向),与np.vsplit类似
print('横向分割后的数组为:\n', np.split(arr, 2, axis=1))#横向分割后的数组为:# [array([[ 0, 1],# [ 4, 5],# [ 8, 9],# [12, 13]]), array([[ 2, 3],# [ 6, 7],# [10, 11],# [14, 15]])]print('纵向分割后的数组为:\n', np.split(arr, 2, axis=0))#纵向分割后的数组为:# [array([[ 0, 1, 2, 3],# [ 4, 5, 6, 7]]), array([[ 8, 9, 10, 11],# [12, 13, 14, 15]])]参考:
Numpy学习笔记(2)
https://blog.chuwu.top/posts/numpy/numpy2/