Numpy 索引重新排序数组
Numpy indexing reorders array
我刚刚偶然发现了一个我不太了解的 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)。如果我从第四个元素中选择一个元素,为什么前两个维度的形状会发生变化?
非常感谢!
编辑:
我在 python 2.7.11
的 numpy 1.11.0 上看到了这个
这是预期的行为...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 允许这种更明智的索引。
为了向后兼容,默认索引不太可能很快更改,尽管它可能会在不久的将来开始针对某些情况发出弃用警告。
我刚刚偶然发现了一个我不太了解的 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)。如果我从第四个元素中选择一个元素,为什么前两个维度的形状会发生变化? 非常感谢!
编辑: 我在 python 2.7.11
的 numpy 1.11.0 上看到了这个这是预期的行为...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 允许这种更明智的索引。
为了向后兼容,默认索引不太可能很快更改,尽管它可能会在不久的将来开始针对某些情况发出弃用警告。