反转许多不同大小的小矩阵 python

invert many small, different-sized matrices python

我在 python 中有一个块对角稀疏矩阵,它有数十万到数百万行,但有许多不同大小的块在 1x1 到 6x6 之间;例如子矩阵上的 plt.spy():

我需要这个矩阵的逆矩阵而不在 python 中循环(太慢了)。我应该能够提取块对角线以获得二维数组列表(尚未实际实现),但即使那样我也不知道如何应用,例如 np.linalg.inv() 到一堆不同的尺寸矩阵。关于以稀疏矩阵形式或通过对角块列表求逆的任何想法?

A​​FAIK,无法使用 Numpy 有效地做到这一点。最好的解决方案是按大小对块进行分组,以矢量化方式计算它们(大多数 Numpy 函数不能处理不同大小的数组)。但是这个解决方案不是很好,因为 Numpy 不是为计算小数组而设计的,而且对于这么小的块来说,开销会很大。

一种解决方案是使用 Numba 来生成快速本机代码以有效地计算您的块。 Numba 支持 typed lists and np.linalg.inv。如果您的输入是稀疏矩阵,最好的解决方案是直接从中提取 sub-blocks 。但是,Numba 还不支持 Scipy 的稀疏矩阵。也就是说,例如,您可以提取 CSR 矩阵的 dataindices 字段(它们是 Numpy 数组),以便使用 Numba 计算它们,尽管这样做有点复杂。