确保并行减少 numpy 数组操作映射到重复位置

Ensure parallel reduction of numpy array operation mapping to repeated position

numpy有没有办法保证映射到重复位置的数组操作进行归约,即它们都在彼此的结果上执行?

a = numpy.zeros([4], int) # [0 0 0 0]
b = numpy.arange(0, 8)    # [0 1 2 3 4 5 6 7]

positions = [0, 0, 1, 1, 2, 2, 3, 3]

a[positions] += b         

# desired result: [0 + 1, 2 + 3, 4 + 5, 6 + 7]
# actual result: random crossover between [0, 2, 4, 6] and [1, 3, 5, 7]

你可以看到 b 的元素 1 和 2 都映射到位置 1 等等,我需要确保 += 添加这两个元素,而默认情况下它看起来可以随机将 1 或 2 添加到零同时,then将结果存储两次,依次是只有一个操作的结果

当存在重复索引时,numpy 数组中的就地添加行为未定义。为确保您想要的行为,请使用 numpy.add.at。 (所有 numpy "ufuncs" 都有 at method。)

例如,这是您的数组:

In [21]: a
Out[21]: array([0, 0, 0, 0])

In [22]: b
Out[22]: array([0, 1, 2, 3, 4, 5, 6, 7])

In [23]: positions
Out[23]: [0, 0, 1, 1, 2, 2, 3, 3]

使用numpy.add.at累加值:

In [24]: np.add.at(a, positions, b)

In [25]: a
Out[25]: array([ 1,  5,  9, 13])