Python 从字典列表创建记录数组

Python 从字典列表创建记录数组,python,numpy,structured-array,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':

给出如下词典列表:

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:无法设置具有序列的数组元素


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

一个问题是字典的迭代没有保留顺序。您可以通过查看
打印值[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_条件
是一个列表,而不仅仅是一个布尔值。因此,您可能希望将数据类型更改为:

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

这样做非常方便:


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

但是这已经抛出了所有的数据类型!对但由于list和str不是对齐的数据,所以这里没有性能问题。因此,数据类型不是很重要。我认为,
interval
是对齐的这一事实就足够了。有没有一个不使用Pandas的简单实现呢?注意,
list
在这里被翻译成
np.object\uu
 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')])