【问题标题】:How do I fill multiple named fields using structured data如何使用结构化数据填充多个命名字段
【发布时间】:2015-10-13 04:34:59
【问题描述】:

我想从某些字段中获取信息,然后使用列表将它们写入另一个变量。

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

【问题讨论】:

    标签: python numpy field multiple-columns structured-array


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我已经厌倦了这种方式,但我认为这会是一种更有效的方式......还是谢谢你!
    • 我可以搜索 numpy github 问题,看看是否有人试图将其添加到结构化数组 __setitem__ 方法中。
    • 由于所有字段都是整数,因此可以将view这些数组作为常规的 1 或 2 维数组,并使用数字索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多