Numpy索引重新排序数组

时间:2016-06-21 08:46:12

标签: 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)

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

编辑: 我在numpy 1.11.0上看到了python 2.7.11

1 个答案:

答案 0 :(得分:4)

预期的行为...... NumPy将使用切片索引的轴和使用数组索引的轴进行不同的处理。默认行为是,在使用切片索引的轴的最终形状之前,生成的形状将具有用数组索引的轴的最终形状。这意味着奇数输出是第一种情况,应该是(1, 3, 3, 3)。但是有人认为它会使用户感到困惑,例如你的一些简单情况,所以当所有用数组索引的轴组合在一起时,得到的形状被放置在输出形状的位置,其中数组索引轴的簇位于原始阵列。

您可以自己测试一下:

>>> print np.ndarray(shape=(3,3,3,3))[:, [0], [0], :].shape
(3, 1, 3)

正如您所经历的那样,这种聪明可能比一致的行为更令人困惑。 NumPy开发人员的共识是,最好不要以不同方式处理聚簇数组索引轴,甚至还有a PR implementing indexer attributes允许这种更精确的索引。

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