使用Coo-matrix创建邻接矩阵的内存问题

时间:2018-10-01 07:48:24

标签: python numpy scipy

嗨,我正在尝试从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内存限制的任何想法

谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

函数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格式数据数组

     

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

     

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

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

可用于创建CSV文件。