我有一个这种形状的多维数组:
(2, 200, 2, 3, 3, 114)
我想使用以下命令从中提取一组特定的值:
pab[0][:][0][0][0][i]
因此,基本上,我需要在第二维上迭代的每个值来修复第一,第三,第四和第五个值。最后一个维度是循环的。
但是,我的切片方法和想要在第二维上提取的方法似乎无法正常工作。经过一番调查,我发现形状没有按预期变化。看来我无法正确理解:
>>> pab.shape
(2, 200, 2, 3, 3, 114)
>>> pab[0].shape
(200, 2, 3, 3, 114)
>>> pab[0][:].shape
(200, 2, 3, 3, 114)
>>> pab[0][:][0].shape
(2, 3, 3, 114) # I would have expected to see (200, 3, 3, 114)
>>> pab[0][:][0][0].shape
(3, 3, 114)
我找到了一些有关多维切片的文章,但没有一篇解释这种行为,或者我误解了它们。
如果有人可以解释为什么数组的形状会如显示的那样变化而不是(200, 3, 3, 114)
所期望的变化,以及正确的方式是什么,我将非常感谢!最后,我试图获得形状为(200, )
答案 0 :(得分:1)
使用numpy
为arr[i][j]...
编制索引适用于所有标量,但不适用于切片。 [:]
不执行任何操作。 (即使使用列表[:]
也只是进行复制。)。因此,您希望将索引合并为一个表达式:
In [40]: arr = np.ones((2, 200, 2, 3, 3, 114),int)
In [41]: arr.shape
Out[41]: (2, 200, 2, 3, 3, 114)
In [42]: arr[0].shape
Out[42]: (200, 2, 3, 3, 114)
In [43]: arr[0,:,0,0].shape
Out[43]: (200, 3, 114)
In [44]: arr[0,:,0,0,0,3].shape
Out[44]: (200,)
像这样在中间放置一个切片会产生意外的结果:
In [45]: arr[0,:,0,0,0,[1,2]].shape
Out[45]: (2, 200)
In [47]: arr[0][:,0,0,0,[1,2]].shape
Out[47]: (200, 2)
此处大小200的切片已移至末尾。这是基本索引和高级索引混合的尴尬案例。 https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing