【发布时间】:2019-11-27 16:43:10
【问题描述】:
给定两个稀疏的 scipy 矩阵 A, B 我想计算逐行外积。
我可以通过多种方式使用 numpy 做到这一点。最简单的可能是
np.einsum('ij,ik->ijk', A, B).reshape(n, -1)
或
(A[:, :, np.newaxis] * B[:, np.newaxis, :]).reshape(n, -1)
其中n 是A 和B 中的行数。
然而,就我而言,通过密集矩阵会消耗太多 RAM。 因此,我发现的唯一选择是使用 python 循环:
sp.sparse.vstack((ra.T@rb).reshape(1,-1) for ra, rb in zip(A,B)).tocsr()
虽然使用较少的 RAM,但速度非常慢。
因此,我的问题是,是否有一种稀疏(RAM 高效)方法来获取两个矩阵的逐行外积,从而使事物保持矢量化?
(类似的问题是numpy elementwise outer product with sparse matrices,但那里的所有答案都经过密集矩阵。)
【问题讨论】:
-
A 和 B 的典型尺寸是多少?
-
@Divakar 我有 1000,000 行和 768 列。每列的典型非零值约为 25。
-
遍历稀疏矩阵的行很慢,因为它需要创建一个新的 (1,n) 稀疏矩阵。 @ 应该足够快,重塑应该没问题,因为它简化了
csrindptr。vstack结合了所有输入矩阵的coo属性,对于这么多行可能会很慢。 -
lil格式有一个快速行view方法,但它仍然必须转换为csr格式才能进行乘法运算。 -
所以你期望一个有 1000,000 行和 768*768 列的矩阵?
标签: python numpy matrix scipy sparse-matrix