【问题标题】:Add scipy sparse row matrix to another sparse matrix将 scipy 稀疏行矩阵添加到另一个稀疏矩阵
【发布时间】:2016-01-04 01:14:55
【问题描述】:

我有一个形状为(70000, 80000)csr_matrix A 和另一个形状为(1, 80000)csr_matrix B。如何有效地将 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,这种方法比只调用一次要慢。

【问题讨论】:

    标签: python numpy matrix scipy


    【解决方案1】:

    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
    

    【讨论】:

    • 这比我的干净; +1。
    • 事实上,这与我的回答有关。噗!没了。
    • @unubtu,您使用的是哪种外壳/解释器?打印“In [185]”的东西?
    • 我发现(在玩了太多之后)sparse.bsr_matrix((np.tile(B.data(N,1)).T[:,:,None], B.indices, B.indptr), shape=(N,M))bsr 格式创建了正确的矩阵,而且速度非常快。但是应用 tocsr 以便添加它会使净时间与您的答案相同。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2017-03-26
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2018-01-19
    • 2017-03-31
    • 2018-08-07
    相关资源
    最近更新 更多