Скажем, у меня есть массив
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: быстрое регулярное среднее значение для большого количества отрезков / точек .