我有一个形状为 (70000, 80000)
的 csr_matrix
A
和另一个 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
,这种方法比只调用它一次要慢。
最佳答案
A + B[np.zeros(A.shape[0])]
是扩展 B
的另一种方式形状与 A
相同.
它的性能和内存占用与 Warren Weckesser's solution 大致相同:
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
更快:
In [187]: %timeit A + sparse.vstack([B for x in range(A.shape[0])])
1 loops, best of 3: 606 ms per loop
关于python - 将 scipy 稀疏行矩阵添加到另一个稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34583539/