Numpy 索引重新排序数组

Chr*_*ris 4 python numpy slice

我刚刚偶然发现了一个我不太了解的 numpy 索引行为。似乎 numpy 正在根据索引模式更改我的轴的顺序。不幸的是,我在文档中找不到对以下内容的解释。有人可以向我解释发生了什么吗?

# This is expected: dimension 1 is reduced to length 1:
print np.ndarray(shape=(3,3,3,3))[:, [0], :, :].shape
>>> (3, 1, 3, 3)

# This is the unexpected behavior:
print np.ndarray(shape=(3,3,3,3))[:, [0], :, 0].shape
>>> (1, 3, 3)
Run Code Online (Sandbox Code Playgroud)

我希望第二个命令产生 (3, 1, 3)。如果我从第四个维度中选择一个元素,为什么前两个维度的形状会发生变化?非常感谢!

编辑:我在 numpy 1.11.0 和 python 2.7.11 上看到这个

Jai*_*ime 5

这是预期的行为...... NumPy 以不同的方式对待用切片索引的轴和用数组索引的轴。默认行为是生成的形状将在生成用切片索引的轴的生成形状之前使用数组索引的轴生成形状。这意味着奇怪的是第一种情况,应该是(1, 3, 3, 3)。但是有人认为它会在一些简单的情况下让用户感到困惑,比如你的,所以当所有用数组索引的轴组合在一起时,结果形状被放置在输出形状的位置,其中数组索引轴的簇在原始数组。

你可以自己测试一下:

>>> print np.ndarray(shape=(3,3,3,3))[:, [0], [0], :].shape
(3, 1, 3)
Run Code Online (Sandbox Code Playgroud)

正如您所经历的那样,这种聪明可能比一致的行为更令人困惑。NumPy 开发人员之间的共识是,最好不要以不同的方式对待聚簇数组索引轴,甚至有一个 PR 实现索引器属性可以允许这种更合理的索引。

为了向后兼容,默认索引不太可能很快改变,尽管它可能会在不久的将来开始针对某些情况发出弃用警告。