当值为 (2x2) numpy 数组时在独立字典中添加值

Add values in independent dictionaries when the values are (2x2) numpy arrays

假设我有两个具有相同键的字典,所有值都是 2x2 numpy 数组。假设:

x1 和 x2 是示例词典。

x1 =  {k: np.random.randint(20, size=(2, 2)) for k in range(5)}
x2 =  {k: np.random.randint(20, size=(2, 2)) for k in range(5)}

我想通过它们的键将 x1 和 x2 加在一起,结果将是一个新字典。

所以如果...

  x1[0] = [[1,2],[3,4]] 

和...

  x2[0] = [[10,20],[30,40]]

key = 0 时的新字典值将是...

  x_total[0] = [[11,22],[33,44]]

下一步将对具有这种结构的许多词典执行此操作。我正在考虑在 for 循环中执行此操作,但如果有更有效的解决方案,我很乐意了解它们。

我已经使用集合库尝试了以下方法

from collections import Counter
a = Counter(x1[0])
b = Counter(x2[0])
c = dict(a + b)

但我认为如果值是数组,这可能不适用。

我也知道 np.add(x1[0], x2[0]) 会导致添加数组,但我想一次对所有键执行此操作.. 如果可能的话。

简单地使用字典理解:

{k: x1.get(k,0) + x2.get(k,0) for k in set(x1)}

例如:

import numpy as np

np.random.seed(0)

x1 =  {k: np.random.randint(20, size=(2, 2)) for k in range(5)}
x2 =  {k: np.random.randint(20, size=(2, 2)) for k in range(5)}

产量:

{0: array([[12, 15],
       [ 0,  3]]), 1: array([[ 3,  7],
       [ 9, 19]]), 2: array([[18,  4],
       [ 6, 12]]), 3: array([[ 1,  6],
       [ 7, 14]]), 4: array([[17,  5],
       [13,  8]])}

{0: array([[ 9, 19],
       [16, 19]]), 1: array([[ 5, 15],
       [15,  0]]), 2: array([[18,  3],
       [17, 19]]), 3: array([[19, 19],
       [14,  7]]), 4: array([[0, 1],
       [9, 0]])}

然后应用我们的解决方案,我们得到:

{0: array([[21, 34],
       [16, 22]]), 1: array([[ 8, 22],
       [24, 19]]), 2: array([[36,  7],
       [23, 31]]), 3: array([[20, 25],
       [21, 21]]), 4: array([[17,  6],
       [22,  8]])}

假设所有词典都是完整的(它们都有相同的键),字典理解应该是一个有效的解决方案:

 x3 = {key: sum(x1[key] + x2[key]) for key in x1}

我使用较短的数据结构以提高可读性,并假设 x1x2 共享相同的键。

>>> x1 = {k:np.arange(k, k+2) for k in range(2)}
>>> x2 = {k:np.arange(k+1, k+3) for k in range(2)}
>>> 
>>> x1
{0: array([0, 1]), 1: array([1, 2])}
>>> x2
{0: array([1, 2]), 1: array([2, 3])}
>>>
>>> x_total = {k: x1[k] + x2[k] for k in x1}
>>> x_total
{0: array([1, 3]), 1: array([3, 5])}

请注意,具有连续整数键的字典,尤其是当它们从零开始时,会浪费内存(稀疏)和时间(散列)。为什么不使用可以更有效地使用整数索引的数组?