2015-10-13 54 views
3

我想從某些字段獲取信息,並使用列表將其寫入另一個變量。如何使用結構化數據填充多個命名字段

import numpy as np 
var1 = np.array([(1,2,3,4),(11,22,33,44),(111,222,333,444)], dtype=([('field1', 'int32'),('field2','int32'),('field3','int32'),('field4','int32')])) 
var2 = np.empty((1), dtype = ([('field1', 'int32'),('field2','int32'),('field5','int32'),('field6','int32')])) 
myList = ['field1', 'field2'] 

我想寫第一和第二個字段的值和第一行到var2。我嘗試以下方法:

var2[(myList)] = var1[(myList)][0] 

,但我得到了以下錯誤:

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices 

我想什麼來達到同樣的,如果我執行:

var2['field1'] = var1['field1'][0] 
var2['field2'] = var1['field2'][0] 

我怎麼能做到這一點的爲了能夠使用更高的列表執行此操作,避免在列表中進行for循環?

回答

2

字段列表適用於左側的「二傳手」使用時,取領域

In [139]: var1[myList] 
Out[139]: 
array([(1, 2), (11, 22), (111, 222)], 
     dtype=[('field1', '<i4'), ('field2', '<i4')]) 

但不是一個子集(這可能是發展的一個區域)。

In [138]: var2[myList]= var1[myList] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-138-570d16e71a2e> in <module>() 
----> 1 var2[myList]= var1[myList] 

IndexError: unsupported iterator index 

所以你需要迭代的字段。

for name in myList: 
    var2[name] = var1[name][0]  

迭代上字段名是在結構化陣列碼常見的做法(如在np.rec函數)。通常情況下,一個結構化數組會有很多元素('行'),但有一些字段('列'),所以迭代字段並不昂貴。


在這種情況下,var2所有字段相同int D型。因此,我可以在相應的2D視圖

In [160]: var2.view(int)[:2] = var1[myList][0].tolist() 

var2數據緩衝器是所有整數執行分配,因此它可以作爲任一字段或規則陣列進行查看(2D或1)。

var2.view(int)[:2] = var1[myList][0]var1['field1'][0]分配給var2的兩個項目。所以我必須把它變成一個列表或元組。

或者我也可以查看var1。有了這個,我發現我也需要reshapeview產生緩衝區的1d陣列視圖。

var2.view(int)[:2]=var1.view(int).reshape((3,4))[0,:2] 

多字段賦值正在開發中,但我認爲它還沒有正式發佈。 https://github.com/numpy/numpy/pull/6053


var1.view(int).reshape((3,4)) # or 
var1.view(int).reshape((-1,4)) 

也可以表示爲:

var1.view((int,4)) 

(化合物視圖更緊湊,雖然沒有任何更快)。

+0

我已經厭倦了這種方式,但我認爲這將是一種更有效的方式......無論如何謝謝! – Xesc

+0

我可以搜索'numpy''github'的問題,看看有沒有人試圖將這個添加到結構化數組__setitem__'方法。 – hpaulj

+0

由於所有字段都是整數,因此可以將這些數組視爲常規1或2d數組,並使用數字索引。 – hpaulj