Это может показаться странным вопросом, но как переписать на чистом питоне следующую строку:
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]]
В двух шагах, показанных в вашем примере, 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
, поэтому я все равно решил опубликовать его.
Каков фактический ввод? Вложенные списки Python или массив NumPy, как предлагает ваш пример?