如何高效地在Python中添加稀疏矩阵

10

我想知道如何在Python中高效地添加稀疏矩阵。

我有一个将大任务分解为子任务并将它们分配到几个CPU上的程序。每个子任务都会产生一个结果(格式为lil_matrix的scipy稀疏矩阵)。

稀疏矩阵的维数是:100000x500000,非常巨大,所以我真的需要最有效的方法将所有产生的稀疏矩阵相加成单个稀疏矩阵,使用一些C编译的方法或类似东西。


3
将稀疏矩阵相加的简单有效方法是将它们转换为稀疏三元组形式,连接这些三元组,然后再转换回稀疏列格式。 - David Heffernan
NumPy中lil_matrices的矩阵加法不够好吗? - Martin v. Löwis
不,这听起来已经足够好了。实际上这就是我的问题。我只是不知道lil_matrix加法是如何工作的 - 我在scipy网站上找不到例子。如果您能给我一个例子,那将解决我的问题。 - Alexandros
1个回答

11

你尝试过计算最简单的方法所需的时间吗?

matrix_result = matrix_a + matrix_b

文档警告说这对LIL矩阵可能很慢,建议使用以下方法可能更快:

matrix_result = (matrix_a.tocsr() + matrix_b.tocsr()).tolil()

第二个对我来说更快。matrix_result = numpy.array_a + sparse_matrix_b.tocsr(),相比于 matrix_result = numpy.array_a + sparse_matrix_b。 - Vicky Liau
A = lil_matrix((10000, 10000)) A[0, :100] = np.ones(100) A[1, :100] = np.ones(100) A[2, :100] = np.ones(100) A[100:300, 200] = np.ones((200,1)) A[100:300, 201] = np.ones((200,1)) A[100:300, 202] = np.ones((200,1)) A[100:300, 203] = np.ones((200,1))B = lil_matrix((10000, 10000)) B[100, :50] = np.ones(50) B[101, :50] = np.ones(50) B[102, :50] = np.ones(50) B[100:200, 5000] = np.ones((100,1)) B[100:200, 5001] = np.ones((100,1)) B[100:200, 5002] = np.ones((100,1))我尝试了这段代码,第一个代码块的速度几乎快了4倍。 - Wildhammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接