【问题标题】:Memory issues with creating an adjacency matrix using Coo-matrix使用 Coo-matrix 创建邻接矩阵的内存问题
【发布时间】:2018-10-02 13:38:23
【问题描述】:

您好,我正在尝试从 CSV 生成一个维度约为 24,000 的邻接矩阵,其中两列显示基因对的组合,一列 1 表示当前的交互......我的目标是拥有它对于不在两列中的组合,为正方形并填充零

我正在使用以下 Python 脚本

import numpy as np
from scipy.sparse import coo_matrix

l, c, v = np.loadtxt("biogrid2.csv", dtype=(int), skiprows=0, delimiter=",").T[:3, :]
m =coo_matrix((l, (v-1, c-1)), shape=(v.max(), c.max()))

m.toarray()

并且运行正常,直到遇到以下错误似乎

File "/home/charlie/anaconda3/lib/python3.6/site-packages/scipy/sparse/base.py", line 1184, in _process_toarray_args
    return np.zeros(self.shape, dtype=self.dtype, order=order)

MemoryError

关于如何绕过 Scipy 中的内存限制的任何想法

谢谢

【问题讨论】:

  • 这会有帮助吗? stackoverflow.com/a/8980156/4909087
  • 它创建了m ok。 toarray 步骤达到内存限制。
  • 你想对m.toarray创建的数组做什么?因为很少有充分的理由将稀疏数组变为密集数组,尤其是因为它通常会导致内存错误。
  • 我想基本上用它来进行癌症基因表达的富集分析,所以我想用它作为一个巨大的邻接矩阵......不与密集阵列结合......只是想要一个矩阵我可以执行分析并最终访问最终矩阵以执行生存分析
  • 问题的重要部分是您想要进行哪些具体类型的分析。特征分析?线性代数?基本布尔数学?我们大多数人都不知道如何做遗传学,但我们可以整天谈论数学。

标签: python numpy scipy


【解决方案1】:

您想要的很可能不是m.toarray,而是m.tocsr()csr 矩阵可以在本机上做简单的线性代数(如.dot() 和矩阵幂),例如这个工作:

m.tocsr()
random_walk_2 = m.dot(m)
random_walk_n = m ** n  
# see https://stackoverflow.com/questions/28702416/matrix-power-for-sparse-matrix-in-python

协方差也应该是可以实现的,但是如果不看你当前的流程是什么,我不确定具体的实现是什么。

编辑:要将输出转换回更简单的格式以读取到csv,您可以通过返回coo.tocoo() 来跟进

m.tocoo()
out = np.c_[m.data, m.row, m.col].T
np.savetxt("foo.csv", out, delimiter=",") 
# see https://stackoverflow.com/questions/6081008/dump-a-numpy-array-into-a-csv-file

【讨论】:

    【解决方案2】:

    函数toarray() 会将您的 24000*24000 稀疏矩阵 (coo_matrix) 转换为 24000*24000 的密集数组(假设您正在加载 int),这至少需要内存

    24000*24000*4 = 大约 2,15Gb。

    为避免使用太多内存,您应该避免转换为密集矩阵(使用toarray())并使用稀疏矩阵进行操作

    如果您需要矩阵平方,您可以执行m*mm.multiply(m),您将得到一个稀疏矩阵。

    要保存矩阵,您有多种选择。

    最简单的一种是 NPZ,见 https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.sparse.save_npz.htmlSave / load scipy sparse csr_matrix in portable data format

    如果你想得到你的结果,因为你的初始 CSV 文件 coo_matrix 有属性

    矩阵的数据COO格式数据数组

    row COO格式矩阵的行索引数组

    col COO格式矩阵的列索引数组

    https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html

    可用于创建 CSV 文件。

    【讨论】:

    • 我试过了,它似乎可以工作,但我如何将矩阵导出到 CSV 或其他类似文件以使用它
    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多