纯 python 中的 numpy 和轴 1

numpy sum axis 1 in pure python

这似乎是一个奇怪的问题,但是你如何在纯 python 下一行重写:

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)不支持在 [=15] 中定义 objective 函数=] 功能


示例:

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]

Try it online!

您可以通过在恰到好处的级别循环进入结构来解决此问题:

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

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

您也可以将所有这些组合在一个语句中,类似于 Kelly Bundy 的回答,通过在中间矩阵的行上调用 accumulate 而无需实际构建中间矩阵:

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