【问题标题】:Computing a sparse subset of the outer sum of two (dense) vectors efficiently in numpy/scipy在 numpy/scipy 中有效地计算两个(密集)向量的外部和的稀疏子集
【发布时间】:2021-07-21 10:03:39
【问题描述】:

假设我在 R^n 中有两个密集向量 a 和 b。我正在尝试计算以下矩阵 S 定义为

S[i,j] = a[i]+b[j] for (i,j) in P,

否则S[i,j] = 0,

其中 P 是 [0, ..., n]^2 中的稀疏子集。现在,我当然可以计算完整的外积,然后使用稀疏子集 P 来形成 S,但我想知道是否有一种方法可以仅在需要时计算 S 的条目,即是否存在在实际计算条目之前馈送集合 P 的方法,以避免计算 n^2 和。我试图寻找这个问题的解决方案,但没有找到任何东西。

提前致谢!

【问题讨论】:

  • 将其翻译成numpy 代码,带有小样本abP。如果这些是正常的 numpy 数组,包括 P 的 0/1 值,(a[:,None]+b)*P 可能是最快的,因为它最大限度地利用了已编译的 numpy 方法。如果P 已经是csr 稀疏矩阵,我们也许可以改进它(只要它足够稀疏)。
  • 我认为你需要看看 Python 生成器、迭代器和产量。 Pythion 的这一方面允许您为计算结果设置占位符,但在使用该值之前不会进行实际计算。

标签: python numpy scipy sparse-matrix


【解决方案1】:

如果 P 是稀疏的,这很容易。

>>> import numpy as np
>>> import scipy.sparse as sps
>>> v1 = np.random.rand(10)
>>> v2 = np.random.rand(10)
>>> P = sps.csr_matrix(np.random.rand(10,10) < 0.1)

>>> P
<10x10 sparse matrix of type '<class 'numpy.bool_'>'
    with 20 stored elements in Compressed Sparse Row format>

现在只需获取非零索引并用它们索引您的向量:

>>> v1_idx, v2_idx = P.nonzero()
>>> OP = sps.csr_matrix((v1[v1_idx] + v2[v2_idx], (v1_idx, v2_idx)), shape=P.shape)

这将为您提供一个稀疏矩阵,其中仅填充您需要的向量值

>>> OP
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in Compressed Sparse Row format>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2012-06-30
    • 2013-07-28
    • 2015-10-09
    相关资源
    最近更新 更多