首页 > 解决方案 > 将存储在字典中的数组附加到python中的单个字典中

问题描述

我有一个具有相同键的字典数组,并且对于每个键我都有一个值数组,就像下面的示例一样:

dict_arr = np.array([{'x': np.array([1,2,3]), 'y': np.array([1,4,9])}, {'x': np.array([4,5,6]), 'y': np.array([16,25,64])}])

我需要做的是将所有内容合并到一个字典中,但是通过合并我的意思是我必须从同一个键连接数组的值。该示例的预期输出为:

{'x': array([1., 2., 3., 4., 5., 6.]), 'y': array([ 1.,  4.,  9., 16., 25., 64.])}

我做的代码如下:

new_dict = {'x': np.array([]), 'y': np.array([])}
for dict_ in dict_arr:
    for key, value in dict_.items():
        new_dict[key] = np.append(new_dict[key], value)
print(new_dict)

它给了我预期的输出,但我想知道是否有一种更聪明的方法可以做到这一点,我只需合并所有字典中的“x”,而不是在每个键和值中迭代每个键和值并更新我的新字典的值.

注意:我真正的字典数组是由一个数据采集板生成的,每个通道不能获取超过 1024 个数据,所以列表中的每个字典,除了最后一个,都有一到三个数组,每个数组有 1024 个浮点值,而我拥有的字典数量通常在 40 万左右。

标签: pythonnumpydictionary

解决方案


列表追加比重复快np.append

In [44]: dict_arr = np.array([{'x': np.array([1,2,3]), 'y': np.array([1,4,9])}, {'x': np.array([4,5,6]), 'y': np
    ...: .array([16,25,64])}])
In [45]: new_dict={'x':[], 'y':[]}
In [46]: for dict in dict_arr:
    ...:     for key,value in dict.items():
    ...:         new_dict[key].append(value)
    ...: 
In [47]: new_dict
Out[47]: 
{'x': [array([1, 2, 3]), array([4, 5, 6])],
 'y': [array([1, 4, 9]), array([16, 25, 64])]}
In [48]: newer = {key:np.hstack(value) for key,value in new_dict.items()}
In [49]: newer
Out[49]: {'x': array([1, 2, 3, 4, 5, 6]), 'y': array([ 1,  4,  9, 16, 25, 64])}

defaultdict可以简化这种字典构建:

In [55]: from collections import defaultdict
In [56]: dd = defaultdict(list)
In [58]: for dict in dict_arr:
    ...:     for k,v in dict.items():
    ...:         dd[k].append(v)
    ...: 
In [59]: dd
Out[59]: 
defaultdict(list,
            {'x': [array([1, 2, 3]), array([4, 5, 6])],
             'y': [array([1, 4, 9]), array([16, 25, 64])]})
In [60]: newer = {key:np.hstack(value) for key,value in dd.items()}
In [61]: newer
Out[61]: {'x': array([1, 2, 3, 4, 5, 6]), 'y': array([ 1,  4,  9, 16, 25, 64])}

由于键是相同的,我们可以使用values

In [54]: list(zip(*[list(dict.values()) for dict in dict_arr]))
Out[54]: [(array([1, 2, 3]), array([4, 5, 6])), (array([1, 4, 9]), array([16, 25, 64]))]

并考虑:

In [63]: [np.hstack(i) for i in zip(*[list(dict.values()) for dict in dict_arr])]
Out[63]: [array([1, 2, 3, 4, 5, 6]), array([ 1,  4,  9, 16, 25, 64])]

这仍然需要恢复dict形式

In [67]: {k:v for k,v in zip(dict_arr[0], Out[63])}
Out[67]: {'x': array([1, 2, 3, 4, 5, 6]), 'y': array([ 1,  4,  9, 16, 25, 64])}

推荐阅读