通常情况下,numpy强制赋值左右两边的形状相同。例如,如果我执行a[:] = b
,则b
必须具有与a
相同的形状或可广播到与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])
看起来它只适用于1d数组,并且只有在赋值的左侧使用花式索引时才有效,但我无法在任何地方找到关于这种行为的文档。如果有文档,请问在哪里可以找到,并且是否能给出一个有用的示例?
更新:
似乎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])
a[[0,1,2]] = [-1, -2]
(它会循环),源数组较大的情况a[[0,1,2]] = [-1, -2, -3, -4]
(它会停止),以及目标数组重复的情况a[[0,0,1]] = [-1, -2, -3]
(它似乎在源数组上迭代。这会对+=
运算符造成严重影响)。 - wim