ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Numpy】第二部分:数组索引、切片与维度操作(结构篇)

【Numpy】第二部分:数组索引、切片与维度操作(结构篇) 第二部分数组索引、切片与维度操作结构篇在 NumPy 中高效地操控数据往往不需要写循环而是通过极其强大的索引规则与维度变换来实现。本篇重点解析如何精准提取矩阵中的目标区块以及如何像捏泥人一样重构数组的形状。1. 基础与高级切片NumPy 的切片建立在 Python 列表切片[start:stop:step]的基础之上但扩展到了多维空间允许通过逗号分隔来同时控制各个维度。单维/多维切片与步长控制在多维数组中通过[行切片, 列切片, ...]的形式提取子矩阵。importnumpyasnp# 构造一个 0 到 24 的 5x5 矩阵matrixnp.arange(25).reshape(5,5)# 提取第 1 到 3 行第 2 到 4 列的子矩阵sub_matrixmatrix[1:4,2:5]print(sub_matrix)# [[ 7 8 9]# [12 13 14]# [17 18 19]]# 步长控制提取所有行但列方向每隔一列取一次即提取偶数列step_matrixmatrix[:,::2]print(step_matrix)# [[ 0 2 4]# [ 5 7 9]# [10 12 14]# [15 17 19]# [20 22 24]]2. 布尔索引掩码布尔索引是数据清洗和特征提取中最常用的手段。通过传入一个由布尔值构成的条件矩阵Mask可以直接筛选出满足条件的元素。条件筛选将条件表达式直接放入方括号中。arrnp.array([10,-5,23,0,-12,8])# 筛选出所有大于 0 的数positive_maskarr0positive_numsarr[positive_mask]# 等价于 arr[arr 0]print(positive_nums)# [10 23 8]# 多条件组合筛选使用 代表与| 代表或注意必须加括号filteredarr[(arr0)|(arr10)]print(filtered)# [-5 23 -12]3. 形状重构在保证元素总数不变的前提下随意改变数组的维度结构。reshape: 返回一个具有新形状的视图原数据不会被修改。支持使用-1作为占位符让 NumPy 自动计算该维度的大小。arrnp.arange(1,13)# 12 个元素# 重构为 3 行 4 列reshapedarr.reshape(3,4)print(reshaped)# [[ 1 2 3 4]# [ 5 6 7 8]# [ 9 10 11 12]]# 自动推导列数3 行列数由 12 / 3 自动算出为 4auto_reshapedarr.reshape(3,-1)resize: 修改数组形状。与reshape不同np.resize返回一个新数组如果新形状总元素数大于原数组它会循环填充原数据如果小于则截断。arrnp.array([1,2,3])# 扩大形状数据循环填充resized_arrnp.resize(arr,(2,3))print(resized_arr)# [[1 2 3]# [1 2 3]]flatten: 将多维数组展平为一维数组。它总是返回数据的深拷贝修改返回值不影响原数组。matrixnp.array([[1,2],[3,4]])flat_arrmatrix.flatten()print(flat_arr)# [1 2 3 4]ravel: 同样是将多维数组展平为一维。但它尽可能返回数据的视图修改返回值会改变原数组因此内存开销极小速度比flatten快。matrixnp.array([[1,2],[3,4]])ravel_arrmatrix.ravel()ravel_arr[0]99# 警告此操作会同步修改原 matrixprint(matrix[0,0])# 994. 维度扩缩在深度学习中经常需要对齐张量维度例如将单张图片(H, W, C)扩展为批次维度(1, H, W, C)。np.newaxis: 在切片中使用的占位符本质上是None用于在指定位置增加一个长度为 1 的新维度。arr_1dnp.array([1,2,3])# 形状 (3,)# 将一维向量转为列向量在第二个维度插入轴col_vectorarr_1d[:,np.newaxis]print(col_vector.shape)# (3, 1)np.expand_dims: 作用与newaxis完全相同但以函数的形式调用语义更明确。arrnp.array([[1,2],[3,4]])# 形状 (2, 2)# 在第 0 个维度最外层扩展expandednp.expand_dims(arr,axis0)print(expanded.shape)# (1, 2, 2)np.squeeze: 与前两者相反用于移除数组形状中所有长度为 1 的维度即降维。arrnp.zeros((1,3,1,5))# 挤压掉所有长度为 1 的空余维度squeezednp.squeeze(arr)print(squeezed.shape)# (3, 5)5. 轴操作与转置涉及到维度之间的交换常用于通道重排如将图片的 RGB 通道移到第一维。transpose: 按照指定的轴序列重新排列数组的多维结构。# 构造一个 3D 数组2 个通道3 行4 列arr_3dnp.ones((2,3,4))# 将通道维度0 轴移动到最后2 轴 - 新形状 (3, 4, 2)transposedarr_3d.transpose(1,2,0)print(transposed.shape)# (3, 4, 2)T:transpose的极简属性写法默认反转所有的轴。在二维矩阵中就是最经典的线性代数转置行变列列变行。matrixnp.array([[1,2,3],[4,5,6]])# 矩阵转置matrix_Tmatrix.Tprint(matrix_T)# [[1 4]# [2 5]# [3 6]]swapaxes: 专门用于交换两个指定的轴。对于只需要对调两个维度的高维张量而言比完整的transpose更方便。arr_3dnp.ones((10,20,30))# 仅交换第 0 轴与第 2 轴swappednp.swapaxes(arr_3d,0,2)print(swapped.shape)# (30, 20, 10)
返回列表