高效求矩阵平均值
在Python中,给定一个n x p的矩阵,比如4 x 4的矩阵,如何返回一个4 x 2的矩阵,这个新矩阵是将原矩阵的前两列和后两列的平均值计算出来的?
例如,给定:
a = array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
我们想要返回一个新矩阵,这个新矩阵的第一列是a中第一列和第二列的平均值,第二列是第三列和第四列的平均值。
我希望这个方法能适用于任意的n x p矩阵,前提是我计算平均值的列数n能够被n整除。
让我再解释一下:对于每一行,我想先计算前两列的平均值,然后计算后两列的平均值。所以计算方式是:
(1 + 2) / 2, (3 + 4) / 2 <- 新矩阵的第一行
(5 + 6) / 2, (7 + 8) / 2 <- 新矩阵的第二行,依此类推。
这样最终应该得到一个4 x 2的矩阵,而不是4 x 4的矩阵。
谢谢。
4 个回答
1
对于大于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
重塑 - 计算平均值 - 再次重塑
>>> 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]])
这个方法应该适用于任何大小的数组,而且重塑操作不会创建数组的副本。
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
,要么就是零。