Ось суммы numpy 1 в чистом питоне

Это может показаться странным вопросом, но как переписать на чистом питоне следующую строку:

np.sum(three_dim_matrix, axis=1).cumsum(axis=1)

cumsum предполагается применить к двумерной матрице, поэтому код для cumsum я уже нашел:

from itertools import accumulate
[list(accumulate(row)) for row in two_dim_matrix]

Если вам действительно интересно, почему я не использую numpy, проблема в том, что оптимизаторы для MINLP (например, GEKKO) не поддерживают определение целевых функций в функциях numpy.


Пример:

example = np.array([[[ 70,  110,  130],
                     [-50, -100, -200]],

                    [[300,  140,  120],
                     [300,  140,  120]],

                    [[ 400, 180, -240],
                     [1000, 320,  560]]])

first_step = np.sum(example, axis=1)
# [[  20   10  -70]
#  [ 600  280  240]
#  [1400  500  320]]

second_step = np.cumsum(first_step, axis=1)
# [[  20   30  -40]
#  [ 600  880 1120]
#  [1400 1900 2220]]

Каков фактический ввод? Вложенные списки Python или массив NumPy, как предлагает ваш пример?

Kelly Bundy 10.04.2022 13:32
На самом деле это должен быть список Python. Если вдаваться в подробности, то сразу за цифрами стоит какая-то оптимизируемая переменная, и numpy в данном случае не подходит
qtsar 10.04.2022 13:33
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

В двух шагах, показанных в вашем примере, data является списком ввода:

first_step = [list(map(sum, zip(*rows))) for rows in data]
second_step = [list(accumulate(row)) for row in first_step]

Или оба шага вместе (должно быть быстрее, так как он не создает промежуточные списки):

both_steps = [list(accumulate(map(sum, zip(*rows)))) for rows in data]

Попробуйте онлайн!

Вы можете решить эту проблему, зациклившись на структуре на нужном уровне:

first_step = [
    [sum(col) for col in zip(*m)]
    for m in example
]

second_step = [list(accumulate(row)) for row in first_step]

Вы также можете объединить все это в одном выражении, аналогично ответу Келли Банди, вызвав аккумулирование прямо в строках промежуточной матрицы без фактического построения промежуточной матрицы:

combined = [
    list(accumulate(sum(col) for col in zip(*m)))
    for m in example
]

Да, мое решение эквивалентно решению @KellyBundy, но немного отличается, используя вложенные понимания вместо map, поэтому я все равно решил опубликовать его.

joanis 10.04.2022 13:42

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