Numpy 花式索引和赋值

Posted

技术标签:

【中文标题】Numpy 花式索引和赋值【英文标题】:Numpy fancy indexing and assignment 【发布时间】:2012-03-14 12:05:26 【问题描述】:

通常 numpy 会强制分配的左侧和右侧匹配,例如,如果我执行a[:] = bb 必须是相同的形状或广播到与a 相同的形状。但该规则似乎有一个例外:

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = a.copy()
>>> a[[0,1,2]] = b[::2]
>>> a
array([0, 2, 4, 3, 4, 5, 6, 7, 8, 9])
>>> a[np.arange(10)] = b[:2]
>>> a
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])

它似乎只适用于一维数组,并且只有在赋值左侧有花哨的索引时,但我无法在任何地方找到这种行为的文档。这种行为是否记录在案,如果有,在哪里,也有人可以举一个例子说明它什么时候有用?

更新:

似乎 numpy flatiter 类型也有这种行为,flatiter 和花式索引之间是否存在一些我不知道的联系?

>>> a.flat = [10,11]
>>> a
array([10, 11, 10, 11, 10, 11, 10, 11, 10, 11])
>>> a.flat[:] = [2,3,4]
>>> a
array([2, 3, 4, 2, 3, 4, 2, 3, 4, 2])
>>> a.flat = range(100)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

【问题讨论】:

您正确地描述了这个特性——只有在结合一维数组的高级索引进行赋值时才允许使用它。虽然我确定我在文档中读到了这一点,但目前我找不到链接。我不时发现这很有用,但我认为如果有专门的功能支持会更好,并且常规分配仍然会出错。 对,我很快就以为它只是广播,但我现在发现它实际上并不符合广播的要求!奇怪! 我不确定这是一个功能还是一个错误......至少,docs.scipy.org/doc/numpy/reference/… 似乎没有将其作为特例提及。 我正在玩的其他有趣的案例.. 源更小a[[0,1,2]] = [-1, -2](它循环),源更大a[[0,1,2]] = [-1, -2, -3, -4](它停止)和目标重复a[[0,0,1]] = [-1, -2, -3](它似乎在来源。在这里对+= 运营商造成严重破坏)。 @wim,[0, 0, 1] 案例是一个单独的问题,无论好坏,这是 numpy 人都知道并且无意更改的设计选择。 scipy.org/FAQ#head-1ed851e9aff803d41d3cded8657b2b15a888ebd5 【参考方案1】:

我认为这种行为是以 R 及其祖先 S/S-plus 为模型的。这就是列表分配(“向量”分配)在那里工作的方式,它被称为“回收”。 R 项目网站讨论了它,但我在this link 找到了更富有启发性的解释。在 R 中,向量是测量值的集合,因此按照它的方式填充或修剪它是有意义的。这种逻辑有多少变成了 numpy,为什么,仍然是一个很好的问题。

【讨论】:

以上是关于Numpy 花式索引和赋值的主要内容,如果未能解决你的问题,请参考以下文章

快速(呃)numpy花式索引和减少?

Numpy:如何在 numpy 中选择项目并为其赋值

变量的三个特征和花式赋值

numpy 的花式索引是如何实现的?

快速 numpy 花式索引

Numpy 花式索引