【问题标题】:Numpy Aggregate Rows and SumNumpy聚合行和总和
【发布时间】:2019-04-13 19:40:50
【问题描述】:

我有一个 Numpy 矩阵:

M = [[55, 5],
 [56, 3],
 [57, 7],
 [58, 9],
 [59, 3],
 [60, 8],
 [61, 1]] 

我想按 group_size 聚合(例如分成 3 个组):

group_size = math.ceil(M.size/groups) # math.ceil(7/3) = 3

每个聚合行的左值是组中的第一个左值,右值是组中所有右值的总和。

预期输出:

R = [[55, 15], # 55 first left column value of first group, 15 sum of all right values in group 
 [58, 20], # 58 first left column value of second group, 20 sum of all right values in group
 [61, 1]] # Third group consist only of one row, remainder

有没有一种有效的方法可以用 Numpy 解决这个问题而无需循环?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:
    a = np.array([[2, 3],[5, 6],[7, 9]])
    b = numpy.zeros(shape=(len(a[0])))
    for i in a:
        b=b+i
        print(b)
    

    【讨论】:

    • 解释,代码的作用以及它如何解决问题中的问题,很少不能改善答案。
    【解决方案2】:

    使用 Python 的解决方案:

    from operator import itemgetter
    
    M = [[55, 5],
         [56, 3],
         [57, 7],
         [58, 9],
         [59, 3],
         [60, 8],
         [61, 1]]
    it = (M[e:e+3] for e in range(0, len(M), 3))
    print([[e[0][0], sum(map(itemgetter(1), e))] for e in it])
    

    输出

    [[55, 15], [58, 20], [61, 1]]
    

    【讨论】:

      【解决方案3】:

      这是使用 NumPy 的一种方法:

      n = 3
      x = M[::n, 0]
      y = np.add.reduceat(M[:, 1], np.arange(0, M.shape[0], n))
      
      R = np.vstack((x, y)).T
      
      print(R)
      
      array([[55, 15],
             [58, 20],
             [61,  1]])
      

      【讨论】:

        【解决方案4】:

        pandas 解决方案应使用aggfirstsum

        group_size = 3
        df = pd.DataFrame(M).groupby(np.arange(len(M)) // group_size).agg({0:'first',1:'sum'})
        print (df)
            0   1
        0  55  15
        1  58  20
        2  61   1
        
        a = np.array(df.values.tolist())
        print(a)
        [[55 15]
         [58 20]
         [61  1]]
        

        【讨论】:

          猜你喜欢
          • 2019-03-27
          • 1970-01-01
          • 2012-05-04
          • 2018-04-20
          • 2015-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多