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

标签 python numpy matrix scipy

我有一个形状为 (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/

相关文章:

python - 选择数组中向量的分量

python - 在 Python 中对多页 TIFF 页面进行平均

python - 最小编辑距离重建

python - 使用带有浮点值的列表运算符 "in"

python:仅当字符在此列表中时才保留字符

python - 元组的 Numpy 随机选择

c - 在 C 中获取二维数组的输入

r - 比较两个矩阵 R 之间的信息

python - 帮助 Python 方法中的内部循环

python - 使用 pyodbc 批量插入 + SQL Server 使用 None/Nan 很慢 + 解决方法