【问题标题】:averaging matrix efficiently有效地平均矩阵
【发布时间】:2010-06-04 23:04:40
【问题描述】:

在 Python 中,给定一个 n x p 矩阵,例如4 x 4,我怎样才能返回一个 4 x 2 的矩阵,它只是平均矩阵的所有 4 行的前两列和最后两列?

例如给定:

a = 数组([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])

返回一个矩阵,该矩阵具有 a[:, 0] 和 a[:, 1] 的平均值以及 a[:, 2] 和 a[:, 3] 的平均值。 我希望这适用于 n x p 的任意矩阵,假设我平均 n 的列数显然可以被 n 整除。

让我澄清一下:对于每一行,我想取前两列的平均值,然后取最后两列的平均值。所以它会是:

1 + 2 / 2, 3 + 4 / 2

这应该产生一个 4 x 2 矩阵而不是 4 x 4。

谢谢。

【问题讨论】:

  • 您想要一个 4x2 矩阵,但您所描述的(使用 [:,0] 等)听起来像是 1x4 矩阵

标签: python numpy scipy


【解决方案1】:

使用一些数学方法怎么样?你可以定义一个矩阵M = [[0.5,0],[0.5,0],[0,0.5],[0,0.5]],这样A*M就是你想要的。

from numpy import array, matrix

A = array([[1, 2, 3, 4], 
           [5, 6, 7, 8], 
           [9, 10, 11, 12], 
           [13, 14, 15, 16]])
M = matrix([[0.5,0],
            [0.5,0],
            [0,0.5],
            [0,0.5]])
print A*M

生成 M 也很简单,条目为 1/n 或零。

【讨论】:

    【解决方案2】:

    重塑 - 得到平均 - 重塑

    >>> a.reshape(-1, a.shape[1]//2).mean(1).reshape(a.shape[0],-1)
    array([[  1.5,   3.5],
           [  5.5,   7.5],
           [  9.5,  11.5],
           [ 13.5,  15.5]])
    

    应该适用于任何数组大小,并且 reshape 不会复制。

    【讨论】:

      【解决方案3】:

      对于 n > 4 的矩阵应该发生什么有点不清楚,但这段代码会做你想做的事:

      a = N.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], dtype=float)
      avg = N.vstack((N.average(a[:,0:2], axis=1), N.average(a[:,2:4], axis=1))).T
      

      这会产生avg =

      array([[  1.5,   3.5],
             [  5.5,   7.5],
             [  9.5,  11.5],
             [ 13.5,  15.5]])
      

      【讨论】:

        【解决方案4】:

        这是一种方法。您只需要更改 groupsize 以使其适用于您所说的其他尺寸,尽管我不完全确定您想要什么。

        groupsize = 2
        out = np.hstack([np.mean(x,axis=1,out=np.zeros((a.shape[0],1))) for x in np.hsplit(a,groupsize)])
        

        产量

        array([[  1.5,   3.5],
           [  5.5,   7.5],
           [  9.5,  11.5],
           [ 13.5,  15.5]])
        

        为out。希望它能给你一些关于如何做你想做的事情的想法。例如,您可以使groupsize 依赖于a 的尺寸。

        【讨论】:

          猜你喜欢
          • 2011-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-02
          • 2016-08-12
          • 2019-05-13
          • 2020-01-05
          相关资源
          最近更新 更多