将稀疏矩阵拆分为多个块,而无需转换为密集

时间:2019-03-07 17:04:39

标签: python numpy matrix scipy sparse-matrix

我想将稀疏矩阵(类型:scipy.sparse.csr.csr_matrix )按正确的顺序拆分为N个部分,并对其进行迭代以将其用作分类预测的输入。

但是,如果尝试使用csr_matrix.toarray()将稀疏矩阵转换为密集矩阵,则会收到MemoryError。经此线程(Error Converting Sparse Matrix to Array with scipy.sparse.csc_matrix.toarray())中的方法测试,转换后的数组大小将占用70gb RAM。

所以我不能使用numpy.array_split()来拆分数组,因为它仅适用于密集矩阵。

还有另一种方法将稀疏矩阵拆分/切片为N个稀疏矩阵吗?

谢谢。


其他修改:

因此,使用稀疏数组X_test进行分块是这样的:

# X_test is a sparse matrix with feature vectors

chunk_results = []
X_dense = csr_matrix.toarray(X_test)
X_test_chunks = np.array_split(X_dense, 20)
for chunk in X_test_chunks:
    chunk_results.append(classifier.predict(chunk))
prediction = np.concatenate(chunk_results)

下面是将一个稀疏的稀疏矩阵转换为稠密的示例:

# sparse
(0, 0)  -0.5
(0, 1)  3.8570557155110414
(0, 2)  -1.975755301731886
(1, 0)  -3.5
(1, 1)  6.54336961554629
(1, 2)  -3.311314222363026

# dense
[[-0.5         3.85705572 -1.9757553 ]
 [-3.5         6.54336962 -3.31131422]]

在密集矩阵中的这两个内部数组中的每一个都是代表一个对象的特征向量。基本上,假设在本例中通过转换进行块分割技术来尝试对它们进行分类,我们将n = 2并获得[-0.5 3.85705572 -1.9757553]和[-3.5 6.54336962 -3.31131422]作为两个块。如果我们有一个更大的矩阵并有更多的条目,则每个块中会有几个这样的向量数组。


解决方案

我通过将稀疏矩阵的行数除以所需的块数来进行变通,然后按照hpaulj的建议将矩阵切成该数目的行的块:

  

Blockquote   np.array_split进行密集数组的切片索引,[arr [i:j] for ...中的i,j]。因此,您可以对csr矩阵进行相同类型的索引编制。稀疏切片的速度不及密集版本,但它可以工作(适用于正确的稀疏格式)。

0 个答案:

没有答案