,给定一个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.
感谢。
答案 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
的维度。