2016-06-21 175 views
3

我刚刚偶然发现了一个我不太明白的numpy索引行为。看起来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与蟒蛇2.7.11

+1

尽管很晦涩,但这种行为[记录](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing)。 – 2016-06-21 09:37:26

回答

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

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