Python:对第三行列表的第二行求和

时间:2015-03-25 16:59:11

标签: python list numpy sum

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

我的问题是我有一个变量列表a[i][t][s],需要对我的一个约束求和。

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

对于下一个约束我需要一个函数,它给我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()

2 个答案:

答案 0 :(得分:1)

您可以使用索引来选择列,然后使用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

答案 1 :(得分:0)

使用切片:

>>> 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数据,在大多数情况下,它会更慢并使用更多内存。