【发布时间】:2020-02-27 20:36:47
【问题描述】:
计算向量之间的成对最小值之和在自然语言处理 (NLP) 中非常流行,并用于计算相交直方图内核 [1]。然而,在 NLP 中,我们经常处理稀疏矩阵。
这是一种使用慢速 for 循环来计算此操作的低效方法:
import numpy as np
from scipy.sparse import csr_matrix
# Initialize sparse matrices
A = csr_matrix(np.clip(np.random.randn(100, 64) - 1, 0, np.inf))
B = csr_matrix(np.clip(np.random.randn(64, 100) - 1, 0, np.inf))
# For each row, col vector i,j in A and B respectively
G = np.zeros((100, 100))
for i in range(A.shape[0]):
for j in range(B.shape[1]):
G[i, j] = A[i].minimum(B[:,j]).sum()
有没有办法在没有 for 循环的情况下做到这一点?
如果可以编译 for 循环,例如在 numba 中使用 jit,我不介意。
这里给出了一个快速密集的版本:Numpy: an efficient way to implement sum of pairwise mins operation
谢谢。
[1]http://blog.datadive.net/histogram-intersection-for-change-detection/
【问题讨论】:
-
非零值是否总是正数?
-
所以,它们并不是很稀疏。为什么要使用稀疏表示?是内存效率困扰你吗?
-
@Divakar 这只是为了说明,我使用的矩阵实际上非常稀疏。
-
@hpaulj,非零值都是正数!
-
那么,您的意思是它们是 NumPy 数组,但非常“稀疏”,就像许多零一样?
标签: python numpy scipy sparse-matrix