我想从一些字段中获取信息,然后使用列表将它们写入另一个变量。
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 循环?
最佳答案
字段列表用于获取字段的子集
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。所以我可以在相应的二维 View 上执行赋值
In [160]: var2.view(int)[:2] = var1[myList][0].tolist()
var2
data buffer 都是 int,所以它既可以看作字段,也可以看作一个常规数组(2d 或 1)。
var2.view(int)[:2] = var1[myList][0]
将 var1['field1'][0]
分配给 var2
。所以我必须把它变成一个列表或元组。
或者,我也可以查看 var1
。有了这个,我发现我也需要 reshape
。 view
生成缓冲区的一维数组 View 。
var2.view(int)[:2]=var1.view(int).reshape((3,4))[0,:2]
Multifield assignment 正在开发中,但我认为它还没有正式发布。 https://github.com/numpy/numpy/pull/6053
var1.view(int).reshape((3,4)) # or
var1.view(int).reshape((-1,4))
也可以表示为:
var1.view((int,4))
(复合 View 更紧凑,但没有更快)。
关于python - 如何使用结构化数据填充多个命名字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33094211/