在numpy/scipy中高效地计算两个(密集)向量的外和的稀疏子集



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

对于p,中的(i,j(,S[i,j]=a[i]+b[j]

S[i,j]=0,否则,

其中p是[0,…,n]^2中的稀疏子集。现在,我当然可以计算完整的外积,然后使用稀疏子集P来形成S,但我想知道是否有一种方法可以只在需要的情况下计算S的项,即是否有方法在实际计算项之前馈送集合P,以避免计算n^2和。我试着寻找这个问题的解决办法,但什么也没找到。

提前感谢!

如果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>

最新更新