Python 大numpy矩阵的Pearson相关

Python 大numpy矩阵的Pearson相关,python,performance,numpy,matrix,pearson,Python,Performance,Numpy,Matrix,Pearson,我有一个24000*316 numpy矩阵,每一行代表一个包含316个时间点的时间序列,我正在计算这些时间序列的每一对之间的皮尔逊相关性。这意味着我将有一个24000*24000 numpy的矩阵,它有皮尔逊值。 我的问题是这需要很长时间。我已经在较小的矩阵(200*200)上测试了我的管道,它可以工作(尽管仍然很慢)。我想知道它是否会如此缓慢(需要一天以上的时间!!!)。我能做些什么。。。 如果有帮助,这是我的代码。。。没有什么特别或困难的 def SimMat(mat,name):

我有一个24000*316 numpy矩阵,每一行代表一个包含316个时间点的时间序列,我正在计算这些时间序列的每一对之间的皮尔逊相关性。这意味着我将有一个24000*24000 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
def SimMat(mat,名称):
mrange=材料形状[0]
打印“mrange:”,mrange
nTRs=材料形状[1]
打印“nTRs:”,nTRs
SimM=numpy.zero((mrange,mrange))
对于范围内的i(m范围):
SimM[i][i]=1
对于范围内的i(m范围):
对于范围内的j(i+1,m范围):
pearV=scipy.stats.pearsonr(mat[i],mat[j])
如果(pearV[1]=0.5):
打印“Pearson值:”,pearV[0]
SimM[i][j]=pearV[0]
SimM[j][i]=0
其他:
SimM[i][j]=SimM[j][i]=0
savetxt(名称,SimM)
返回SimM,nTRs

谢谢

实现的主要问题是存储相关系数所需的内存量(至少4.5GB)。没有理由将已计算的系数保留在内存中。对于这样的问题,我喜欢使用hdf5来存储中间结果,因为它们与numpy配合得很好。以下是一个完整的、最低限度的工作示例:

import numpy as np
import h5py
from scipy.stats import pearsonr

# Create the dataset
h5 = h5py.File("data.h5",'w')
h5["test"] = np.random.random(size=(24000,316))
h5.close()

# Compute dot products
h5 = h5py.File("data.h5",'r+')
A  = h5["test"][:]

N   = A.shape[0]
out = h5.require_dataset("pearson", shape=(N,N), dtype=float)

for i in range(N):
    out[i] = [pearsonr(A[i],A[j])[0] for j in range(N)]

测试前100行表明,在单个内核上只需8小时。如果您将其并行化,它应该具有与核心数成线性关系的加速比。

您应该查看代码示例中的缩进(并编辑您的帖子以修复它!)。这是不对的,它确实会影响你的程序是否会按演示的那样运行。你打算用24000*24000矩阵做什么?也许您可以分批工作并聚合部分结果,这样您就不需要在内存或磁盘上使用完整的24000*24000矩阵了。@DavidW谢谢您指出这一点。将代码粘贴到此处后缩进不正确。但原始代码有适当的缩进,这意味着它正在工作,我有一个性能问题。@WarrenWeckesser在获得巨大的矩阵后,我将根据某种方法(FDR)对其设置阈值,在这个过程中,我需要同时使用所有的皮尔逊值,所以我必须保留它们。。。也许我能想出一些办法。。。我必须考虑一下。谢谢你!我相信这会让一切变得更快,这也是我需要知道的!