高效求矩阵平均值

6 投票
4 回答
861 浏览
提问于 2025-04-15 23:35

在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,要么就是零。

撰写回答