2014-02-16 61 views
6

非常簡單的問題:我有一個具有多個列的結構化數組,我只想用另一個預先存在的數組填充其中的一部分(但不止一個)。numpy:如何一次填充結構化數組中的多個字段

這就是我想:

strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)]) 
x = np.array([2, 3]) 
strc[['x', 'y']][0] = x 

這給了我這個未來的警告:

主要:1:FutureWarning:numpy的檢測到您(可能)寫通過numpy.diagonal或通過在記錄 陣列中選擇多個字段返回的數組 。此代碼會在將來的版本numpy的突破可能性 - 詳見numpy.diagonal或arrays.indexing參考文檔。 快速修復是製作一個明確的副本(例如,做 arr.diagonal()。copy()或arr [['f0','f1']]。copy())。

但即使這是一個警告,結構化數組不會被填充。到目前爲止,我遍歷兩個數組超過和它的作品,但我想這是非常低效的。有沒有更好的辦法?

+0

http://stackoverflow.com/questions/3058602/python-numpy-structured-array-recarray-assigning - 值 - 到 - 切片指出,試圖索引幾個領域會產生一個副本,而不是一個視圖。如果您正在使用比場更行的工作,有什麼不對迭代領域。 – hpaulj

回答

11

,如果所有字段具有相同的D型,您可以創建一個視圖:

import numpy as np 
strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)]) 
strc_view = strc.view(int).reshape(len(strc), -1) 
x = np.array([2, 3]) 
strc_view[0, [0, 1]] = x 

如果你想,可以創建列視圖中的任何結構陣列的通用解決方案,你可以嘗試:

import numpy as np 
strc = np.zeros(3, dtype=[('x', int), ('y', float), ('z', int), ('t', "i8")]) 

def fields_view(arr, fields): 
    dtype2 = np.dtype({name:arr.dtype.fields[name] for name in fields}) 
    return np.ndarray(arr.shape, dtype2, arr, 0, arr.strides) 

v1 = fields_view(strc, ["x", "z"]) 
v1[0] = 10, 100 

v2 = fields_view(strc, ["y", "z"]) 
v2[1:] = [(3.14, 7)] 

v3 = fields_view(strc, ["x", "t"]) 

v3[1:] = [(1000, 2**16)] 

print strc 

這裏是輸出:

[(10, 0.0, 100, 0L) (1000, 3.14, 7, 65536L) (1000, 3.14, 7, 65536L)] 
+0

謝謝HYRY,我認爲您的解決方案是太多了我的小unefficiency uneasyness但你從哪裏學這個黑暗魔法也可以爲別人 – Federico

+0

是有用的......? –

相關問題