2012-02-24 84 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中,矢量是測量的集合,所以按照它的方式進行填充或修剪是有意義的。這個邏輯有多少使它變得粗糙,爲什麼它仍然是一個很好的問題。