【问题标题】:Python revert accumulated matrixPython恢复累积矩阵
【发布时间】:2014-12-03 11:19:42
【问题描述】:

我有一个这样的矩阵

[[1,2,4,6],
[4,7,9,9],
[1,9,10,20]]

如何在 python 中按列获得部分总和?

[[1,2,4,6],
[(4-1),(7-2),(9-4),(9-6)],
[(1-4),(9-7),(10-9),(20-9)]]

【问题讨论】:

    标签: python matrix cumsum


    【解决方案1】:

    如果您想要一个不涉及 numpy 的解决方案,并且只使用列表列表和 itertools.tee(内置),那么下面应该可以工作

    from itertools import tee
    
    a = [[1,2,4,6],
         [4,7,9,9],
         [1,9,10,20]]
    
    b = []
    b.append(a[0])
    
    # Create two iterators and advance one once.
    x, y = tee(a)
    next(y)
    
    # Iterate over your two iterators and construct a list t which is their difference
    # then append this list to b
    for i, j in zip(x, y):
      t = [h-g for g, h in zip(i,j)]
      b.append(t)
    
    print(b)
    # [[1, 2, 4, 6], 
    #  [3, 5, 5, 3], 
    #  [-3, 2, 1, 11]]
    

    【讨论】:

      【解决方案2】:

      试试

      np.vstack((Z[0],np.diff(Z,axis=0)))

      其中Z 是您要区分的矩阵。

      【讨论】:

        【解决方案3】:

        从第二行开始,你想要的只是行i和行i-1的区别,第一行只是原始数组的第一行。最简单的方法是使用numpy。所以这行得通:

        In [1]: import numpy as np
        
        In [2]: a = np.array( [[1,2,4,6],
           ...: [4,7,9,9],
           ...: [1,9,10,20]]
           ...: )
        
        In [3]: np.vstack( (a[0], a[1:]-a[:-1]) )
        Out[3]: 
        array([[ 1,  2,  4,  6],
               [ 3,  5,  5,  3],
               [-3,  2,  1, 11]])
        

        正如亨利·沃顿勋爵 (!) 指出的那样,a[1:]-a[:-1] 的区别与 np.diff(a, axis=0) 相同。

        【讨论】:

          【解决方案4】:

          如果你不想使用 numpyitertools,这里是代码

          >>> a=[[1,2,4,6],
          ... [4,7,9,9],
          ... [1,9,10,20]]
          >>> a_r = a[::-1]  # reverse original list
          >>> for i in range(len(a_r)-1):
          ...    for j in range(len(a_r[0])):
          ...       a_r[i][j] = a_r[i][j] - a_r[i+1][j]
          ... 
          >>> a=a_r[::-1]  # reverse result 
          >>> for i in a: print i
          [1, 2, 4, 6]
          [3, 5, 5, 3]
          [-3, 2, 1, 11]
          

          【讨论】:

            【解决方案5】:

            我觉得这个不错

            >>> a = [[1,2,4,6],
            ... [4,7,9,9],
            ... [1,9,10,20]]
            >>> c = [[0]*5] ; c.extend(a)
            >>> print [[ s-r for r, s in zip(*t)] for t in zip(c[:-1],c[1:])]
            [[1, 2, 4, 6], [3, 5, 5, 3], [-3, 2, 1, 11]]
            >>> 
            

            在这里,我在列表列表中添加了一个零列表(获得c),然后使用zip 进行一些打包和解包,我有一个包含预期结果的列表列表。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-11-11
              • 1970-01-01
              • 1970-01-01
              • 2017-06-11
              • 1970-01-01
              • 1970-01-01
              • 2014-09-10
              • 2017-06-10
              相关资源
              最近更新 更多