如何理解以下多维数组的奇特索引行为?

sig*_*now 5 python numpy numpy-slicing numpy-ndarray array-broadcasting

我们注意到,对于多维数组来说,花式索引和切片的混合使用非常令人困惑且没有记录,例如:

In [114]: x = np.arange(720).reshape((2,3,4,5,6))

In [115]: x[:,:,:,0,[0,1,2,4,5]].shape
Out[115]: (2, 3, 4, 5)

In [116]: x[:,:,0,:,[0,1,2,4,5]].shape
Out[116]: (5, 2, 3, 5)
Run Code Online (Sandbox Code Playgroud)

我已经在https://numpy.org/doc/stable/user/basics.indexing.html上阅读了花哨索引的用法,我可以理解这一点x[:,0,:,[1,2]] = [x[:,0,:,1], x[:,0,:,2]]。但是我无法理解为什么上面的结果在第一个维度上Input [115]有所Input [116]不同。有人可以指出此类广播规则的记录在哪里吗?

谢谢!

我尝试在文档中搜索奇特的索引,并将问题发布到 Github 上的 numpy 存储库。

Chr*_*axs 2

关于为什么存在歧义的一些额外见解:

在问题的后一种情况下,第三轴和第五轴被索引,因此从新数组中消失。必须在某处添加一个新轴(其形状等于索引的广播)。如果我是 numpy,并且必须将形状(5,)数组插入到带有 "shape" 的数组中(2, 3, -, 5, -),我会将其放置在第一个缺失的维度吗?还是第二个?

正是因为切片分隔了两个高级索引,所以 numpy 无法替换一组连续的轴,因此不知道是否在分隔切片之前或之后插入新轴。结果,新轴被插入到前面:

(5, 2, 3, 5)
 ^  ^^^^^^^--- old dimensions
 |
new dimension
Run Code Online (Sandbox Code Playgroud)

只有在第一种情况下,消失的轴都是相邻的(“形状” (2, 3, 4, -, -)),新轴才能明确地插入到末尾。

注意:在幕后,numpy 总是在开头插入新轴。它只是(我认为主要是为了方便)转置数组以在明确时将新轴移动到位。

同样有趣的是Numpy 增强提案 21