理解4D ndarray的高级多维索引行为
NumPy高级索引问题解答
问题1:为何np.arange索引失败,而冒号切片能正常工作?
这本质是切片索引和高级数组索引的机制差异:
- 冒号
:属于切片索引,它是对整个维度的连续范围做选择,和原数组的维度一一对应。比如array[0:6,46:50,:,:],每个切片对应原数组的一个维度,直接生成各维度长度匹配的结果,自然符合预期的(6,4,96,96)形状。 np.arange生成的是数组,属于高级索引。当同时用两个一维数组做索引时,NumPy要求这两个索引数组能通过广播规则兼容。你的samples_range是(6,)形状,middle_slices_range是(4,)形状,两者既不同形,也没有维度为1的轴,无法完成广播,因此抛出形状不匹配的错误。
问题2:为何给第一个索引数组加newaxis就能解决问题?
给samples_range[:, np.newaxis]后,它的形状从(6,)变成了(6,1),此时和(4,)形状的middle_slices_range满足广播规则:
(6,1)会在第二个维度上重复4次,扩展为(6,4)(4,)会在第一个维度上重复6次,扩展为(6,4)
两个索引数组广播后形状一致,NumPy会按逐元素配对的方式索引:对每个i(0-5)和j(0-3),取array[samples_range[i], middle_slices_range[j], :, :],最后把这些结果堆叠成(6,4,96,96)的数组,正好匹配你的需求。
补充:分两步索引成功的原因
第一步array[samples_range]得到(6,96,96,96)的数组,此时用[:, middle_slices_range, :, :]时,第一个:是切片(保留第一个维度的所有6个元素),middle_slices_range是对第二个维度的高级索引,两者维度对齐:第一个维度保留6个,第二个维度选4个,最终得到预期形状。
内容的提问来源于stack exchange,提问作者Marshall
相关产品推荐
相关产品推荐

