Numpy花哨索引和分配

Bi *_*ico 12 python indexing numpy

通常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])
Run Code Online (Sandbox Code Playgroud)

它似乎只适用于1d数组,并且只有在赋值的左侧有花哨的索引,但我无法在任何地方找到此行为的文档.是否记录了这种行为,如果有的话,还有人可以举例说明它何时有用?

更新:

看起来numpy flatiter类型的行为也是这样,flatiter和fancy indexing之间是否存在一些我不知道的联系?

>>> 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])
Run Code Online (Sandbox Code Playgroud)

ale*_*xis 1

我认为这种行为是模仿 R 及其祖先 S/S-plus 的。这就是列表分配(“向量”分配)的工作原理,称为“回收”。R 项目网站对此进行了讨论,但我在此链接中找到了更具启发性的解释。在 R 中,向量是测量值的集合,因此按其方式填充或修剪它是有意义的。这种逻辑有多少已经进入 numpy,为什么,仍然是一个好问题。