将scipy稀疏行矩阵添加到另一个稀疏矩阵

时间:2016-01-04 01:14:55

标签: python numpy matrix scipy

我有一个csr_matrix A形状(70000, 80000)和另一个csr_matrix B形状(1, 80000)。如何有效地将B添加到A的每一行?一个想法是以某种方式创建一个稀疏矩阵B',其中重复B行,但numpy.repeat不起作用,并使用一个矩阵创建B'非常记忆效率低下。

我还尝试迭代A的每一行并向其添加B,但这又是非常低效的时间。

更新 我尝试了一些非常简单的东西,它似乎比我上面提到的想法非常有效。我们的想法是使用scipy.sparse.vstack

C = sparse.vstack([B for x in range(A.shape[0])])
A + C

这对我的任务表现很好!更多的实现:我最初尝试了一种迭代方法,我多次调用vstack,这种方法比只调用一次要慢。

1 个答案:

答案 0 :(得分:2)

$ find . | xargs -d"\n" testcli.js [ "filename1", "filename2", "file name with spaces", "foldername", "folder name with spaces" ] 是将A + B[np.zeros(A.shape[0])]扩展为与B相同形状的另一种方式。

它与Warren Weckesser's solution具有相同的性能和内存占用:

A
import numpy as np
import scipy.sparse as sparse

N, M = 70000, 80000
A = sparse.rand(N, M, density=0.001).tocsr()
B = sparse.rand(1, M, density=0.001).tocsr()

并且似乎比使用In [185]: %timeit u = sparse.csr_matrix(np.ones((A.shape[0], 1), dtype=B.dtype)); Bp = u * B; A + Bp 1 loops, best of 3: 284 ms per loop In [186]: %timeit A + B[np.zeros(A.shape[0])] 1 loops, best of 3: 280 ms per loop 更快:

sparse.vstack