如何使用结构化数据填充多个命名字段

时间:2015-10-13 04:34:59

标签: python numpy field multiple-columns structured-array

我想从一些字段中获取信息,然后使用列表将它们写入另一个变量。

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']

我想将第1和第2个字段以及第1行的值写入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循环?

1 个答案:

答案 0 :(得分: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 dtype。所以我可以在相应的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))

(复合视图更紧凑,但速度更快)。