【问题标题】:Add values in independent dictionaries when the values are (2x2) numpy arrays当值是 (2x2) numpy 数组时,在独立字典中添加值
【发布时间】:2019-04-30 19:34:28
【问题描述】:

假设我有两个具有相同键的字典,并且所有值都是 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]) 会导致数组的添加,但我想一次对所有键执行此操作.. 如果可能的话。

【问题讨论】:

    标签: python dictionary numpy-ndarray


    【解决方案1】:

    只需使用字典理解:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        为了便于阅读,我使用较短的数据结构并假设 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])}
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-02-09
          • 2021-09-12
          • 1970-01-01
          • 2021-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多