当值为 (2x2) numpy 数组时在独立字典中添加值
Add values in independent dictionaries when the values are (2x2) numpy arrays
假设我有两个具有相同键的字典,所有值都是 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]])}
假设所有词典都是完整的(它们都有相同的键),字典理解应该是一个有效的解决方案:
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])}
请注意,具有连续整数键的字典,尤其是当它们从零开始时,会浪费内存(稀疏)和时间(散列)。为什么不使用可以更有效地使用整数索引的数组?
假设我有两个具有相同键的字典,所有值都是 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]])}
假设所有词典都是完整的(它们都有相同的键),字典理解应该是一个有效的解决方案:
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])}
请注意,具有连续整数键的字典,尤其是当它们从零开始时,会浪费内存(稀疏)和时间(散列)。为什么不使用可以更有效地使用整数索引的数组?