2015-10-13 17 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