关于NumPy中3D ndarray形状的疑问(版本1.24.2)
NumPy 3D数组索引后形状反转的原因
先看代码里的核心差异:基本切片(如0:4)和高级索引(如range(0,4))的行为完全不同。
你的原数组a形状是(10,3,4),执行a[1,:,:]后得到一个(3,4)的二维数组。接下来的两种索引操作:
a[1,:,0:4]用的是基本切片,切片操作会保留原数组的维度顺序,只是选择了最后一维的全部元素,所以结果还是(3,4)。a[1,:,range(0,4)]用的是整数数组索引(高级索引的一种),这里range(0,4)会被转换成一维数组array([0,1,2,3])。NumPy处理高级索引时,会将索引数组的形状与原数组未被索引的维度进行广播匹配:
原数组切片后是(3,4),用长度为4的一维数组索引最后一维,NumPy会逐个取出原数组的第0、1、2、3列,每列是3个元素,最终将这些列堆叠成一个新数组,形状就变成了(4,3)——相当于把原二维数组做了转置。
如果想通过高级索引得到(3,4)的结果,可以给索引数组增加一个维度,让它和原数组的前维度匹配:
print(a[1,:,range(0,4)[np.newaxis, :]].shape) # 输出(3,4)
不过在这个场景下,range(0,4)完全等价于切片0:4,直接用切片更简洁高效。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

