2011-03-04 70 views
0

我想學習如何使用numpy的結構化數組。具體而言,我試圖一次向多個領域添加信息。我想:numpy結構化數組:幫助理解輸出

import numpy as np 

numrec = np.zeros(8, dtype=[('col0', 'int16'), ('col1', 'int16'), 
          ('col2', 'int16'), ('col3', 'int16')]) 

numrec[['col1','col2']][0:2] = [(3,5), (1,8)] 
print numrec 

以上不起作用。這些值不會添加到指定的列中。令人驚訝的是當我運行它時,我沒有得到任何錯誤。有人可以解釋發生了什麼嗎?

謝謝。

回答

9

您正在設置臨時值。

numrec[["col1", "col2"]] 

返回數組的一個副本。你可以通過OWNDATA標誌看到這個。

>>> numrec[["col1", "col2"]].flags["OWNDATA"] 
True 

當指數與列表,numpy的返回數據的副本numpy的陣列。它必須是副本,因爲通常情況下,列表可能無法解析爲基礎數據的常規有序視圖。 (這適用於任何numpy的陣列,而不僅僅是結構化陣列。)

比較

>>> numrec[["col1"]].flags["OWNDATA"] 
True 
>>> numrec["col1"].flags["OWNDATA"] 
False 

此外,如果numpy的陣列是一個視圖,基底構件保持底層數組。

>>> id(numrec["col1"].base) == id(numrec) 
True 
+5

現貨。值得一提的是,對於所有「花哨索引」數組,這不僅僅是結構化數組。我會把這個相關的最近的帖子鏈接到這裏:http://stackoverflow.com/questions/5127991/can-i-get-a-view-of-a-numpy-array-at-specified-indexes-從花式索引中查看 – Paul 2011-03-04 21:34:47

+0

謝謝!我不知道這個。所以,如果我有兩個listone(長度爲3)和listwo(長度爲3),我可以更新'col1''和''numrec''的'col2'中的前三個元素等於這些列表同時。我知道我可以做'numrec ['col1'] [0:3] = listone'和'numrec ['col2'] [0:3] = listtwo'。但是我可以在一個命令中一起完成嗎?謝謝。 – Curious2learn 2011-03-04 22:33:06

+0

保羅,我可能沒有強調它,但這就是我沒有說「當你索引一個numpy結構化陣列......」無論如何,我可以說得更清楚。所以我只是加了一個括號。 – AFoglia 2011-03-04 22:57:56