Как получить частичные кумулятивные суммы (положительных и отрицательных чисел) в массиве?

У меня есть массив с положительными и отрицательными числами, и я хочу сделать кумулятивную сумму чисел одного знака, пока следующее число не будет иметь противоположный знак. Он начинается снова с 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])

Любая эффективная идея очень поможет...

Вы используете этот выходной формат напрямую?

Dan Getz 27.11.2022 14:50

как вы относитесь к 0? Как положительные числа?

mozway 27.11.2022 14:59

0 положительны, как в примере

tibibou 27.11.2022 15:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один векторный вариант:

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?

tibibou 27.11.2022 15:35

Спасибо 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 27.11.2022 16:15

@tibibou, можешь еще раз проверить?

mozway 27.11.2022 22:10

Другие вопросы по теме