NumPy索引可以重新排列数组

4

我刚刚遇到了一个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
虽然有些晦涩,但这种行为已经被记录在文档中了(http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing)。 - user2379410
1个回答

5
预期行为是...NumPy对使用切片索引的轴和使用数组索引的轴进行了不同的处理。默认行为是,用数组索引的轴产生的形状将排在用切片索引的轴产生的形状之前。这意味着奇怪的情况是第一个,应该是(1, 3, 3, 3)。但有人认为这会让一些简单的情况(例如您的情况)混淆用户,因此当所有用数组索引的轴被组合在一起时,结果形状被放置在原始数组中数组索引轴的聚类所在的输出形状位置上。
您可以自己测试:
>>> print np.ndarray(shape=(3,3,3,3))[:, [0], [0], :].shape
(3, 1, 3)

正如您所经历的那样,这种聪明反而比一致的行为更加令人困惑。NumPy开发人员的共识是最好不要将聚类数组索引轴与其他轴区别对待,甚至有一个实现索引器属性的PR(https://github.com/numpy/numpy/pull/6075)可以实现更加合理的索引。
出于向后兼容性的考虑,默认索引不太可能在短期内发生改变,但它可能会开始针对某些情况发出弃用警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接