纯 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]
您可以通过在恰到好处的级别循环进入结构来解决此问题:
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
]
这似乎是一个奇怪的问题,但是你如何在纯 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]
您可以通过在恰到好处的级别循环进入结构来解决此问题:
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
]