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

Python 当值为(2x2)numpy数组时,在独立字典中添加值,python,dictionary,numpy-ndarray,Python,Dictionary,Numpy Ndarray,假设我有两个具有相同键的字典,所有值都是2x2 numpy数组。假设: 字典有相同的键 对于所有字典和键,每个值都是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

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

  • 字典有相同的键
  • 对于所有字典和键,每个值都是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]])}

只需使用字典即可:

{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}

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

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

为了可读性,我使用较短的数据结构,并假设
x1
x2
共享相同的键

>>> 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])}

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

为了可读性,我使用较短的数据结构,并假设
x1
x2
共享相同的键

>>> 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])}
请注意,具有连续整数键的字典,特别是当它们从零开始时,会浪费内存(稀疏性)和时间(散列)。为什么不使用一个可以更有效地索引整数的数组呢