在numpy中计算多个矩阵的均值

0 投票
1 回答
2069 浏览
提问于 2025-04-16 05:18

我有很多个csv文件,每个文件里都有差不多一样的矩阵。每个矩阵有11列,行数要么是5行,要么是6行。列代表变量,行代表测试条件。有些矩阵没有最后一个测试条件的数据,所以有的矩阵是5行,有的是6行。

我在用Python 2.6,使用numpy和scipy来处理这些数据。

我想问的是:
我该如何高效地创建一个汇总矩阵,这个矩阵里的每个单元格都是所有相同矩阵中对应单元格的平均值呢?

这个汇总矩阵的结构和其他矩阵是一样的,只不过汇总矩阵每个单元格里的值是所有相同矩阵中对应单元格的平均值。如果某个矩阵没有最后一个测试条件的数据,我希望在计算平均值时不要把它当作零。换句话说,我想要的是所有非零值的平均值。

有没有人能给我一个简洁灵活的代码组织方式,让它能完成我想做的事情,同时代码尽量少,后面如果想用其他数据结构也能方便调整?

我知道怎么把所有的csv文件读进来,也知道怎么写输出。我只是想不出最有效的方式来安排数据在脚本中的流动,包括是用Python数组还是numpy数组,以及如何组织操作等等。

我尝试过用很多不同的方法来编写这个代码,但它们似乎都比较复杂,而且如果我以后想用这个代码处理其他数据结构时,会显得不够灵活。

1 个回答

2

你可以使用掩码数组。假设N是你的csv文件数量。你可以把所有的数据存储在一个形状为(N,11,6)的掩码数组A里。

from numpy import *
A = ma.zeros((N,11,6))
A.mask = zeros_like(A) # fills the mask with zeros: nothing is masked
A.mask = (A.data == 0) # another way of masking: mask all data equal to zero
A.mask[0,0,0] = True # mask a value
A[1,2,3] = 12. # fill a value: like an usual array

接着,沿着第一个轴计算平均值,并考虑到被掩盖的值,可以用下面的方式得到:

mean(A, axis=0) # the returned shape is (11,6)

撰写回答