1

我有一个这种形状的多维数组:

(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, )

4

1 回答 1

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

于 2019-05-21T17:59:01.873 回答