首页 文章

Numpy索引重新排序数组

提问于
浏览
3

我刚刚偶然发现了一个我不太明白的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 回答

  • 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允许这种更精确的索引 .

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

相关问题