我想从一些字段中获取信息,然后使用列表将它们写入另一个变量。
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循环?
答案 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
。有了这个,我发现我也需要reshape
。 view
生成缓冲区的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))
(复合视图更紧凑,但速度更快)。