2

次のような辞書のリストがあるとします。

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になり、辞書のリストからレコード配列を作成できるかを知りたいです。

4

2 に答える 2

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']フィールドの順序を確認してください。

于 2016-05-10T09:28:20.150 に答える
3

1 つの問題は、辞書の反復が順序を保持しないことです。これは、あなたのコードを使用した場合にどのような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)

もう 1 つのことはbool_condition、データ内の が単なるブール値ではなくリストであることです。したがって、dtype を次のように変更することをお勧めします。

dt = np.dtype([
    ('name', np.str_, 50),
    ('interval', np.float64, (2,)),
    ('bool_condition', list)
])
于 2016-05-10T09:17:07.653 に答える