Python 如何使用结构化数据填充多个命名字段
我想从一些字段中获取信息,然后使用列表将它们写入另一个变量Python 如何使用结构化数据填充多个命名字段,python,numpy,field,multiple-columns,structured-array,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'),(
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循环?字段列表用于获取字段的子集
In [139]: var1[myList]
Out[139]:
array([(1, 2), (11, 22), (111, 222)],
dtype=[('field1', '<i4'), ('field2', '<i4')])
迭代字段名是结构化数组代码中的常见做法(如np.rec
函数)。通常,结构化数组将有许多元素(“行”)但有几个字段(“列”),因此对字段的迭代并不昂贵
在这种情况下,
var2
的所有字段都是相同的int
dtype。因此,我可以在相应的二维视图上执行赋值
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
。有了这个,我发现我还需要重塑。视图
生成缓冲区的1d数组视图
var2.view(int)[:2]=var1.view(int).reshape((3,4))[0,:2]
多字段分配正在开发中,但我认为还没有正式发布
也可以表示为:
var1.view((int,4))
(复合视图更紧凑,但没有更快)。我已经厌倦了这种方式,但我认为这将是一种更有效的方式。。。无论如何谢谢你!我可以搜索
numpy
github
问题,查看是否有人试图将其添加到结构化数组\uuuuuuu setitem\uuuuu
方法中。由于所有字段都是int,因此可以将这些数组视为常规的1或2d数组,并使用数字索引。
var2.view(int)[:2]=var1.view(int).reshape((3,4))[0,:2]
var1.view(int).reshape((3,4)) # or
var1.view(int).reshape((-1,4))
var1.view((int,4))