确保并行减少 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])
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])