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

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

最佳答案

字段列表用于获取字段的子集

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。有了这个,我发现我也需要 reshapeview 生成缓冲区的一维数组 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/

相关文章:

MySql 更新并加入另一个表

python - 脚本在读取文件时跳过第二个 for 循环

python - 在 Numpy 下对两个矩阵中的所有成对行应用一个函数

python - 在 numpy 中创建这个 block 矩阵

python - 使用 3 个索引对 4 维数组进行切片时会发生什么?

django - Django自定义字段验证器与清理

python - 在Python中记录未使用MySQL连接器插入

python - GAE NDB "Result cannot be set twice"错误

python - Python 中的 registerTempTable 的最大表名长度

Delphi 5 - TField 上的尺寸不匹配