我有一个矩阵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个小时)。有办法向量化吗?
非常感谢!
答案 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]。