Numpy 切片多维错误产生意外结果

Numpy slicing multidimensional error produces unexpected result

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

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

我发现一些文章谈论多维切片,但其中 none 解释了这种行为,或者我误解了它们。

如果有人能解释为什么数组的形状会如图所示发生变化而不是 (200, 3, 3, 114) 的预期,以及正确的方法是什么,我将不胜感激!最后我试图获得一个形状数组 (200, )

索引 numpyarr[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