有没有一种方法可以对嵌套循环进行矢量化处理,以计算spearman相关性及其p值?

时间:2019-06-26 16:33:15

标签: python vectorization nested-loops adjacency-matrix p-value

我有一个矩阵m,具有8300列和18行。每列代表一个基因;每行一个样本我想计算邻接矩阵(使用spearman相关性)和相应的p值矩阵。

到目前为止,我得到的代码是:

W = np.zeros((n_genes, n_genes))
P = np.zeros((n_genes, n_genes))

for i in range(0, n_genes):
    for j in range(0, n_genes):
        W[i,j], P[i,j] = st.spearmanr(m[:,i], m[:,j])

效率极低(使用GPU在colab-google中运行大约需要11个小时)。有办法向量化吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.stats.spearmanr.html

使用此函数,您似乎可以为两个参数传入整个m矩阵,它将在所有列之间进行相关和p值,它将其解释为变量(行是变量的样本)。然后,它以矩阵形式输出p值和相关性。因此,您可以摆脱for循环,并一次性生成相关性和p值矩阵。即使没有一次性完成此操作,您似乎也要遍历两次所有数据以形成对称矩阵。我本来会做第二个循环,例如“对于range(i,n_genes)中的j:”,然后在循环主体中填写两个条目[i,j]和[j,i]。