У меня есть массив с положительными и отрицательными числами, и я хочу сделать кумулятивную сумму чисел одного знака, пока следующее число не будет иметь противоположный знак. Он начинается снова с 0. Может быть, лучше объяснить с помощью образца. Вот исходный массив:
np.array([0.2, 0.5, 1.3, 0.6, -0.3, -1.1, 0.2, -2.0, 0.7, 1.1, 0.0, -1.2])
И вывод, который я ожидаю без использования цикла, конечно:
np.array([0.0, 0.0, 0.0, 2.6, 0.0, -1.4, 0.2, -2.0, 0.0, 0.0, 1.8, -1.2])
Любая эффективная идея очень поможет...
как вы относитесь к 0? Как положительные числа?
0 положительны, как в примере
Один векторный вариант:
a = np.array([0.2, 0.5, 1.3, 0.6, -0.3, -1.1, 0.2, -2.0, 0.7, 1.1, 0.0, -1.2])
cs = np.cumsum(a)
idx = np.nonzero(np.r_[np.diff(a>0), True])
out = np.zeros_like(a)
out[idx] = np.diff(np.r_[0, cs[idx]])
Выход:
array([ 0. , 0. , 0. , 2.6, 0. , -1.4, 0.2, -2. , 0. , 1.8, 0. , -1.2])
Спасибо mozway, все работает как положено. Как бы вы обработали последний элемент в массиве (-1.2), чтобы он появился в массиве out?
Спасибо mozway, это работает с моими исходными данными и с a = np.array([0.2, 0.5, 1.3, 0.6, -0.3, -1.1, 0.2, -2.0, 0.7, 1.1, 0.0, -1.2, -1.6] ). К сожалению, это не работает, если последние 2 числа имеют другой знак, как в: -1.2, 1.6]) Могу добавить 0 в конце, после 1.6 работает. Позже я могу удалить его, но я подозреваю, что есть более разумный подход...
@tibibou, можешь еще раз проверить?
Вы используете этот выходной формат напрямую?