如何转换下面的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}]
答案 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)
这是一个解决方案,适用于其他答案未涵盖的以下情况:
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}]