Python:对 3 维列表的第二行求和

Python: Sum over second row of 3 dimensional list

我或多或少是 python 的新手,正在尝试使用 gurobi 构建优化模型。

我的问题是我有一个变量列表 a[i][t][s] 并且需要对我的一个约束进行加总。

对于其他约束,我使用了函数 np.sum(a[i][t]),它给了我总和 a[i][t][0] + a[i][t][1] + ... + a[i][t][s],这正是我所需要的。

对于下一个约束,我需要一个函数,它给我 a[i][1][s] + a[i][2][s] + ... + a[i][t][s] 但不知道如何获得它,也没有在网上找到任何关于它的信息。

我希望有人能帮我找到修复第一个和第三个值而不是第一个和第二个值的代码。

非常感谢,但如果我对轴求和,我会得到不止一个表达式。 结果如下:

> <gurobi.LinExpr: a[0, 0, 0] + a[0, 1, 0] + a[0, 2, 0] + ... 
> <gurobi.LinExpr: a[0, 0, 1] + a[0, 1, 1] + a[0, 2, 1] + ...

等等。但我需要的只是一个表达式,其中 i 和 s 是固定的,总和遍及所有不同的 t 值。我现在用

for i in dataid:
        for t in possible_demand.index:
            m.addConstr(np.sum([row[t] for row in a[i]]) == 1)
    m.update()

您可以对 select 列使用索引,然后使用 sum :

np.sum(a[i,::,s])

演示:

>>> z
array([[[1, 2, 3],
        [4, 5, 6]],

       [[0, 1, 0],
        [3, 3, 3]],

       [[4, 5, 6],
        [5, 6, 1]]])
>>> z[0,::,0]
array([1, 4])
>>> np.sum(z[0,::,0])
5
>>> z[1,::,0]
array([0, 3])
>>> z[2,::,2]
array([6, 1])

如果你想获取列表的列,你可以使用 zip :

>>> a=list(z)
>>> cl=[zip(*i) for i in a]
[[(1, 4), (2, 5), (3, 6)], [(0, 3), (1, 3), (0, 3)], [(4, 5), (5, 6), (6, 1)]]
>>> sum(cl[0][0]) #= z[0,::,0]
5

使用切片:

>>> A=np.arange(9).reshape(3,3)
>>> A
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> A[:,1]
array([1, 4, 7])
>>> np.sum(A[:,1])
12

对于多维,您使用 fancy indexing:

>>> B=np.arange(27).reshape(3,3,3)
>>> B
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

假设您想要来自所有三个数组的第 2 列的数据:

>>> C=B[...,2]
>>> C
array([[ 2,  5,  8],
       [11, 14, 17],
       [20, 23, 26]])

您也可以在 sum:

中使用
>>> np.sum(B[...,2])
126

你说希望有一种方法可以用列表来做到这一点,而不是将列表更改为数组。

numpy 中切片的结果不一定是新列表;它很可能是 view。这很容易证明:

>>> B
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])
>>> C=B[...,2]
>>> C
array([[ 2,  5,  8],
       [11, 14, 17],
       [20, 23, 26]])
>>> B[0,0,2]=555
>>> B
array([[[  0,   1, 555],
        [  3,   4,   5],
        [  6,   7,   8]],

       [[  9,  10,  11],
        [ 12,  13,  14],
        [ 15,  16,  17]],

       [[ 18,  19,  20],
        [ 21,  22,  23],
        [ 24,  25,  26]]])
>>> C
array([[555,   5,   8],
       [ 11,  14,  17],
       [ 20,  23,  26]])

您可以看到视图 C 随着基础数组 B 的更改而实时更改。

您还可以测试某物是否是视图:

>>> C.flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False              # if it were a new array, this would be True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

因此,使用 numpy 数组最高效 方法是使用 numpy 工具。如果你翻译成 Python 数据,在大多数情况下,它会更慢并且使用更多内存。