【发布时间】:2015-07-18 12:17:03
【问题描述】:
我有一个 24000 * 316 的 numpy 矩阵,每一行代表一个具有 316 个时间点的时间序列,我正在计算每对这些时间序列之间的 pearson 相关性。结果意味着我将有一个 24000 * 24000 具有 pearson 值的 numpy 矩阵。 我的问题是这需要很长时间。我已经在较小的矩阵(200 * 200)上测试了我的管道并且它可以工作(尽管仍然很慢)。我想知道它是否会这么慢(需要一天多的时间!!!)。我能做些什么... 如果有帮助,这就是我的代码……没什么特别或难的……
def SimMat(mat,name):
mrange = mat.shape[0]
print "mrange:", mrange
nTRs = mat.shape[1]
print "nTRs:", nTRs
SimM = numpy.zeros((mrange,mrange))
for i in range(mrange):
SimM[i][i] = 1
for i in range (mrange):
for j in range(i+1, mrange):
pearV = scipy.stats.pearsonr(mat[i], mat[j])
if(pearV[1] <= 0.05):
if(pearV[0] >= 0.5):
print "Pearson value:", pearV[0]
SimM[i][j] = pearV[0]
SimM[j][i] = 0
else:
SimM[i][j] = SimM[j][i] = 0
numpy.savetxt(name, SimM)
return SimM, nTRs
谢谢
【问题讨论】:
-
您应该查看代码示例中的缩进(并编辑您的帖子以修复它!)。这是不对的,它确实会影响您的程序是否会按呈现方式运行。
-
你打算用那个 24000*24000 矩阵做什么?也许您可以分批工作并汇总部分结果,因此您永远不需要内存或磁盘中的完整 24000*24000 矩阵。
-
@DavidW 感谢您指出这一点。在此处粘贴代码后缩进不正确。但是原始代码有适当的缩进,这意味着它正在工作并且我遇到了性能问题。
-
@WarrenWeckesser 在获得巨大的矩阵后,我将根据某种方法(FDR)对其进行阈值处理,在此过程中我需要同时需要所有 pearson 值,所以我必须保留他们……也许我能想出办法……我得好好想想。谢谢
标签: python performance numpy matrix pearson