【问题标题】:Is there a way to vectorize a nested loop that calculates the spearman correlation and it's p-values?有没有办法对计算 spearman 相关性及其 p 值的嵌套循环进行矢量化?
【发布时间】:2019-11-08 16:06:44
【问题描述】:

我有一个矩阵 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 个小时)。有没有办法将其矢量化?

非常感谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 你完全正确。我不知道我在想什么。无论如何,现在这个过程需要 15 秒。
    • 哈哈哈通常是最小的更正可以节省最多的时间。 11 小时!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多