我想对两个稀疏的SciPy矩阵进行矩阵相乘。但是,结果不是稀疏的,所以我想将其存储为NumPy数组。
有没有可能高效地完成这一点,也就是说,不需要先创建一个“稀疏”矩阵,然后再转换它?我可以自由选择任何输入格式(无论哪个更高效)。
例如:两个10000x10000 99%的稀疏矩阵的乘积具有随机分布的零将是稠密的:
n = 10_000
a = np.random.randn(n, n) * (np.random.randint(100, size=(n, n)) == 0)
b = np.random.randn(n, n) * (np.random.randint(100, size=(n, n)) == 0)
c = a.dot(b)
np.count_nonzero(c) / c.size # should be 0.63
1条答案
按热度按时间dgsult0t1#
是的,这是一种非常低效的存储矩阵的方法。但是在scipy中没有办法直接转换为dense。您可以使用sparseBLAS函数直接转换为dense(在您描述的用例中存在)。
我使用了一个python wrapper for MKL,它 Package 了mkl_sparse_spmmd:
它也是线程化的,所以它比scipy快得多。安装MKL是留给读者的(尽管
conda install -c intel mkl
可能是最简单的)