Scipy稀疏三角矩阵?

9 投票
1 回答
4279 浏览
提问于 2025-04-16 00:22

我正在使用Scipy来构建一个很大的稀疏矩阵(250k X 250k),这个矩阵是一个共现矩阵,使用的是scipy.sparse.lil_matrix。共现矩阵是三角形的;也就是说,M[i,j]等于M[j,i]。因为存储所有数据两次会非常低效(在我的情况下甚至是不可能的),所以我现在只在坐标(i,j)上存储数据,其中i总是小于j。换句话说,我在(2,3)上存储了一个值,而在(3,2)上没有存储值,尽管在我的模型中(3,2)应该等于(2,3)。(下面的矩阵可以作为例子)

我的问题是,我需要能够随机提取与给定索引对应的数据,但至少按照我现在的做法,一半的数据在行里,一半在列里,像这样:

M = 
    [1 2 3 4
     0 5 6 7
     0 0 8 9
     0 0 0 10]

所以,给定上面的矩阵,我想能够执行类似M[1]的查询,并得到[2,5,6,7]的结果。我有两个问题:

1) 有没有比先查询行,然后查询列,再把两个结果合并起来更高效(最好是内置的)的方法?这样做不好,因为无论我使用CSC(基于列)还是CSR(基于行)的内部表示,这两个查询中总有一个是非常低效的。

2) 我是不是在使用Scipy的正确部分?我在Scipy库中看到了一些提到三角矩阵的函数,但它们似乎都是从完整矩阵中获取三角矩阵。在我的情况下,(我认为)我已经有了一个三角矩阵,并想对它进行操作。

非常感谢。

1 个回答

2

我想说,你不能既想吃蛋糕又想留着蛋糕:如果你想要节省存储空间,就不能存储完整的行(就像你说的那样);如果你想要快速访问行,那么你就得存储完整的行。

虽然实际的性能取决于你的应用场景,但你可以看看下面的方法是否适合你:

  1. 你可以使用Scipy的稀疏矩阵来节省存储空间。

  2. 你可以自动将你的矩阵进行对称化(在StackOverflow上有一个小技巧,至少在常规矩阵上是有效的)。

  3. 然后你可以访问它的行(或列);这是否高效取决于稀疏矩阵的实现……

撰写回答