2010-06-04 107 views
6

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

例如下式给出:

一个=阵列([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15 ,16]])

返回一个矩阵,其平均值为[:, 0]和a [:,1],平均值为[:, 2]和a [:, 3]。 我想这个工作的n×p的任意矩阵,假设我对n的平均数的列数显然可以被n整除。

让我澄清:对于每一行,我想要取前两列的平均值,然后是最后两列的平均值。因此,这将是:

1 + 2/2,3 + 4/2 < - 行新的矩阵的2等

- 行新的矩阵 5 + 6/2,7 + 8/2 <的1

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

谢谢。

+0

你想要一个4x2的矩阵,但是你所描述的(用[:,0]等)听起来像它将是一个1x4矩阵 – 2010-06-04 23:07:53

回答

1

这是一个有点不清楚应该发生与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]]) 
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的尺寸。

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或零。

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

应该对任何数组大小工作,重塑不进行复印。