说我有一个数组
data = np.arange(6)
我想找到整个数组和后半部分的总和np.add.reduceat
。1
如果我这样做:
np.add.reduceat(data, [0, 6, 3])[::2]
我立即得到一个错误
IndexError: index 6 out-of-bounds in add.reduceat [0, 6)
如果我这样做
np.add.reduceat(data, [0, 5, 3])[::2]
我得到了错误的答案(10 应该是 15):
array([10, 12])
我能想出的唯一解决方案是屏蔽需要最后一个索引的位置,从中减去 1,然后将最后一个元素添加回那里:
index = np.array([0, 6, 3])
mask = (index == data.size)
index[mask] -= 1
result = np.add.reduceat(data, index)
# Mask is shifted back by one because it's the previous element that needs to be updated
result[:-1][mask[1:]] += data[-1]
然后result[::2]
给出想要的答案。对于我期望成为优雅的单线(并且比这更快)的东西,这看起来像是一个巨大的组合。
1我完全意识到有更好的方法来做到这一点。这只是为了说明的目的而设计的示例。这个问题的真正问题源于尝试解决numpy: fast regular-spaced average for large numbers of line segments/points。