嗨,我正在尝试从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内存限制的任何想法
谢谢
答案 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*m
或m.multiply(m)
,您就会得到一个稀疏矩阵。
要保存矩阵,您有几种选择。
最简单的是NPZ,请参见https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.sparse.save_npz.html或Save / 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文件。