平均矩阵有效

时间:2010-06-04 23:04:41

标签: python numpy scipy

Python中的

,给定一个n x p矩阵,例如: 4 x 4,我怎样才能返回一个4 x 2的矩阵,它简单地平均矩阵的所有4行的前两列和最后两列?

e.g。给出:

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

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

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

1 + 2 / 2,3 + 4/2 < - 新矩阵的第1行 5 + 6 / 2,7 + 8/2&lt; - 新矩阵的第2行等

应该产生4乘2的矩阵而不是4 x 4.

感谢。

4 个答案:

答案 0 :(得分:5)

如何使用数学?您可以定义矩阵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或零。

答案 1 :(得分:4)

重塑 - 获取平均值 - 重塑

>>> 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]])

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

答案 2 :(得分:1)

对于具有n&gt;的矩阵应该会发生什么有点不清楚? 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]])

答案 3 :(得分:1)

这是一种方法。您只需更改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的维度。