Scipy稀疏三角矩阵?

9
我正在使用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
它被称为三角形上部打包存储格式。我认为从三角矩阵中获取整个列或行的有效方法并不多。 - Anycorn
2
M[i, j]==M[j, i] 的意思是矩阵是对称的,而非三角形的。 - Eric O. Lebigot
不错的观点。虽然根据维基百科的定义,这个矩阵也是(上)三角形的。 - gilesc
1
供您参考:上三角与对称不同:上三角指的是 M[i, j<i] == 0,即矩阵在左下角以下为零。维基百科“Upper triangular”页面中有一些例子。 - Eric O. Lebigot
1个回答

2
我认为你不能两全其美:如果你想要高效的存储,就不能存储完整的行(正如你所说的);如果你想要高效的行访问,我会说你必须存储完整的行。
虽然实际表现取决于你的应用程序,但你可以检查以下方法是否适合你:
1. 使用Scipy的稀疏矩阵进行高效存储。 2. 自动对称化矩阵(StackOverflow上有一个小技巧,至少对于常规矩阵有效)。 3. 然后可以访问它的行(或列),这取决于稀疏矩阵的实现效率。

我本来就有点担心。不过还是谢谢你。 - gilesc

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