如何压缩矩阵以避免内存错误?

时间:2018-11-14 21:09:03

标签: python numpy memory-management scipy

以下是我有的numpy数组。我需要为id ph temp cond 1 7 44 3 2 5 45 5 3 5 12 8 之类的实例创建一个包含Zeors的矩阵。

np.zeroes([1,1])

但是,基于矩阵的大小(如您在上面看到的,newEdges = array([['0', 'Firm'], ['1', 'Firm'], ['2', 'Firm'], ..., ['binA', 'year2017_bin'], ['binA', 'year2017_bin'], ['binA', 'year2017_bin']], dtype='<U21') newEdges.shape #(63673218, 2) newEdges.size #127346436 ),如果我运行语法来生成零矩阵,则会得到一个(63673218, 2)

他是完整语法:

Memory Error

如何解决此错误?或者,我如何安全地将这个巨大的矩阵转换为稀疏矩阵,以便在下面进行进一步的计算:

print(newEdges)
unique_Bin = np.unique(newEdges[:,0])
n_unique_Bin = len(unique_Bin)
unique_Bin
n_unique_Bin
#3351248

Q = np.zeros([n_unique_Bin,n_unique_Bin])

--------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-16-581dfaca2eab> in <module>()
----> 1 Q = np.zeros([n_unique_Bin,n_unique_Bin])

MemoryError: 

我的内存中还有24GB用于计算。

1 个答案:

答案 0 :(得分:0)

仅指出这一点,您正在尝试创建大小为3,351,248 x 3,351,248的数组。这是11,230,863,157,504项! 11.2万亿个条目!您尝试进行打印的事实使我认为您尚未意识到它有多大。我认为如果没有稀疏矩阵,您将无法做到这一点。首先,您可能应该确保需要执行此操作,看看是否还有其他方法。

否则,您可以使用scipy创建稀疏矩阵

import numpy as np
import scipy
Q = scipy.sparse.csr_matrix((n_unique_Bin,n_unique_Bin), dtype = np.int8)

然后从那里去。