2012-02-24 48 views
12

通常numpy强制任务的左侧和右侧匹配,所以例如如果我做a[:] = b,b必须是相同的形状或广播为a相同的形状。但似乎是一个例外,该规则:Numpy花哨的索引和任务

>>> 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]) 
+3

您正确地描述了此功能 - 仅在与一维阵列上的高级索引结合使用分配时才允许它。虽然我确定在文档中阅读了这些内容,但目前我找不到链接。我觉得现在和当时有用,不过我认为如果这是由专用功能支持并且定期分配仍然会给出错误,情况会更好。 – 2012-02-24 01:39:02

+0

对,我很快认为它只是广播,但我现在看到它实际上并不符合广播要求!奇怪的! – wim 2012-02-24 03:20:46

+0

我不确定它是一个功能还是一个bug ......至少,http://docs.scipy.org/doc/numpy/reference/internals.code-explanations.html#getting-or-setting似乎不是把这作为一个特例提及。 – Tanriol 2012-02-28 20:26:32

回答

1

我认为这种行为是建模在R及其祖先S/S加上。这就是列表分配(“矢量”分配)在那里的作用,它被称为“回收”。 R项目网站对此进行了讨论,但我在this link发现了一个更具启发性的解释。在R中,矢量是测量的集合,所以按照它的方式进行填充或修剪是有意义的。这个逻辑有多少使它变得粗糙,为什么它仍然是一个很好的问题。