从字典列表创建一个 Record 数组
Create a Record array from a list of dictionaries
给定字典列表如下:
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
,然后从字典列表中创建记录数组。
一个问题是字典的迭代不保留顺序。你可以通过查看 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)
])
用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']
确保字段的顺序。
给定字典列表如下:
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
,然后从字典列表中创建记录数组。
一个问题是字典的迭代不保留顺序。你可以通过查看 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)
])
用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']
确保字段的顺序。