高维数组索引核心是理解轴的来源与目标对应关系:整数数组索引按序抓取,一维结果形状同索引数组,二维默认沿axis=0;布尔索引生成掩码筛选,多条件用&、|、~。

高维数组的索引映射不是简单找位置,而是明确“从哪取、按什么顺序、放到哪一维”——核心在于理解轴(axis)的来源与目标对应关系,而非机械套用语法。
用整数数组做高级索引:按序抓取,不排序
直接用 arr[idx] 是最常用也最易错的方式:
- 一维时,
arr[[2, 0, 3]]返回[arr[2], arr[0], arr[3]],结果形状和索引数组一致 - 二维时,默认沿第 0 轴(行)索引:
arr[[1, 0]]取第 1 行和第 0 行,拼成新二维数组 - 想沿列操作?不能只写
arr[:, [2, 0]]—— 这是合法切片,但若用整数数组索引列,需确保维度对齐;更稳妥的是np.take(arr, [2, 0], axis=1) - 索引值必须在合法范围内,越界会报错;如需容错,改用
np.take(..., mode='clip')
布尔索引:条件驱动,自动广播
布尔索引本质是生成掩码,适用于筛选场景:
-
arr[arr > 5]返回所有大于 5 的元素,一维结果扁平化;二维时保持原结构逻辑,但输出是一维数组 - 多条件组合用
&(不是 and)、|(不是 or)、~(取反):mask = (arr[:, 0] > 1) & (arr[:, 2] - 布尔数组长度必须与被索引轴长度一致;用于高维时,可配合
np.ix_()实现行列联合筛选
newaxis 与切片冒号:控制输出维度
加不加冒号,决定结果是否“升维”:
-
X[:, 3]得到一维数组,shape 是(3,);X[:, 3:]是二维切片,shape 是(3, 1) - 想把一维结果转为列向量?用
X[:, 3][:, np.newaxis]或等价写法X[:, 3, np.newaxis] - 也可用
None替代np.newaxis,语义相同:X[:, 3, None]
转置与 axes 映射:重排轴而非移动数据
转置不是“把某维挪到前面”,而是定义“新轴 i 的数据来自原轴几”:
-
arr.transpose((2, 0, 1))表示:新第 0 轴 ← 原第 2 轴,新第 1 轴 ← 原第 0 轴,新第 2 轴 ← 原第 1 轴 - 图像从 H×W×C → C×H×W:用
img.transpose((2, 0, 1)),不是img.T(后者默认翻转所有轴) - 验证是否真转置(没拷贝):用
np.may_share_memory(arr, arr_t),返回True说明是视图
不复杂但容易忽略。











