块索引重新排序数组

2022-03-26 00:00:00 python numpy slice

问题描述

我刚才无意中发现了一种我不太理解的麻木索引行为。看起来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可以实现更合理的索引。

出于向后兼容性考虑,默认索引不太可能很快更改,尽管在不远的将来它可能会在某些情况下开始发出弃用警告。

相关文章