从字典列表中创建一个Record数组

时间:2016-05-10 08:58:46

标签: python numpy structured-array

给出一个字典列表如下:

dict_data = [
    {'name': 'r1', 'interval': [1800.0, 1900.0], 'bool_condition': [True, False]},
    {'name': 'r2', 'interval': [1600.0, 1500.0], 'bool_condition': [False]},
    {'name': 'r3', 'interval': [1400.0, 1600.0], 'bool_condition': [True]}
]

我想从字典数据创建一个记录数组。 但是,当我尝试以下操作时,我得到ValueError

import numpy as np
dt = np.dtype([
('name', np.str_, 50), ('interval', np.float64, (2,)),
    ('bool_condition', np.bool)
])
values = [tuple(val.values()) for val in dict_data]
arr = np.rec.array(values, dtype=dt)

错误: ValueError: cannot set an array element with a sequence

我想知道如何更正确dtype然后从字典列表中创建记录数组。

2 个答案:

答案 0 :(得分:4)

使用pandas

进行此操作非常方便
 In [247]: pd.DataFrame(dict_data)[['name','interval','bool_condition']].to_records(False)

Out[247]: 
rec.array([('r1', [1800.0, 1900.0], [True, False]),
 ('r2', [1600.0, 1500.0], [False]), ('r3', [1400.0, 1600.0], [True])], 
          dtype=[('name', 'O'), ('interval', 'O'), ('bool_condition', 'O')])

['name','interval','bool_condition']确保字段的顺序。

答案 1 :(得分:3)

一个问题是字典的迭代不保留顺序。如果我使用您的代码,您可以通过查看print values[0]给出([1800.0, 1900.0], [True, False], 'r1')来看到这一点。

而是使用

import numpy as np
dt = np.dtype([
    ('name', np.str_, 50),
    ('interval', np.float64, (2,)),
    ('bool_condition', np.bool)
])
values = [
    tuple([val['name'], val['interval'], val['bool_condition']])
    for val in dict_data
]
arr = np.rec.array(values, dtype=dt)

另一件事是数据中的bool_condition是一个列表而不仅仅是一个布尔值。因此,您可能希望将dtype更改为:

dt = np.dtype([
    ('name', np.str_, 50),
    ('interval', np.float64, (2,)),
    ('bool_condition', list)
])