将numpy记录数组转换为字典列表的有效方法

时间:2010-02-04 22:21:16

标签: python numpy

如何转换下面的numpy记录数组:

recs = [('Bill', 31, 260.0), ('Fred', 15, 145.0)]
r = rec.fromrecords(recs, names='name, age, weight', formats='S30, i2, f4')

到字典列表中:

[{'name': 'Bill', 'age': 31, 'weight': 260.0}, 
'name': 'Fred', 'age': 15, 'weight': 145.0}]

4 个答案:

答案 0 :(得分:15)

我不确定是否有内置功能,但以下可以完成这项工作。

>>> [dict(zip(r.dtype.names,x)) for x  in r]
[{'age': 31, 'name': 'Bill', 'weight': 260.0}, 
{'age': 15, 'name': 'Fred', 'weight': 145.0}]

答案 1 :(得分:1)

这取决于所需的最终结构。此示例显示由几个1D子集组成的numpy重新排列。要改为使用python字典,可能的转换是:

import numpy as np

a = np.rec.array([np.array([1,3,6]), np.array([3.4,4.2,-1.2])], names=['t', 'x'])

b = {name:a[name] for name in a.dtype.names}

答案 2 :(得分:1)

这是一个解决方案,适用于其他答案未涵盖的以下情况:

  • 0 维数组(标量)。例如np.array((1, 2), dtype=[('a', 'float32'), ('b', 'float32')])
  • np.void 类型的元素(索引记录数组的结果)
  • 结构的多维数组
  • 包含结构体的结构体,(例如 structured_to_dict(np.zeros((), dtype=[('a', [('b', 'float32', (2,))])]))
  • 以上任何一种的组合。
def structured_to_dict(arr: np.ndarray):
    import numpy as np

    if np.ndim(arr) == 0:
        if arr.dtype.names == None:
            return arr.item()
        # accessing by int does *not* work when arr is a zero-dimensional array!
        return {k: structured_to_dict(arr[k]) for k in arr.dtype.names}
    return [structured_to_dict(v) for v in arr]

答案 3 :(得分:-1)

罗伯特·克恩在Numpy-discussion回答

<小时/> 该讨论的结束电子邮件副本:

  
    

如何转换下面的numpy记录数组:     recs = [('Bill',31,260.0),('Fred',15,145.0)]     r = rec.fromrecords(recs,names ='name,age,weight',formats ='S30,i2,f4')     到字典列表:     [{'name':'Bill','age':31,'weight':260.0},     'name':'Fred','age':15,'weight':145.0}]

  
     

假设你的记录数组只有1D:

     

在[6]中:r.dtype.names Out [6] :('name','age','weight')

     

在[7]中:names = r.dtype.names

     

在[8]中:[dict(zip(names,record))记录在r] Out [8]:[{'age':   31,'名字':'比尔','体重':260.0},{'年龄':15,'名字':'弗雷德',   '体重':145.0}]