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 循环?

4

1 回答 1

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都是相同的intdtype。所以我可以在相应的二维视图上执行分配

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一维数组视图。

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))

(复合视图更紧凑,虽然不是更快)。

于 2015-10-13T04:56:39.027 回答