【发布时间】:2012-03-14 12:05:26
【问题描述】:
通常 numpy 会强制分配的左侧和右侧匹配,例如,如果我执行a[:] = b,b 必须是相同的形状或广播到与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