我正在使用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库中看到了一些关于三角形矩阵的函数,但它们似乎围绕着从完整矩阵获取三角形矩阵。 在我的情况下,(我认为)我已经有一个三角形矩阵,并且想要操作它。
非常感谢。
M[i, j]==M[j, i]
的意思是矩阵是对称的,而非三角形的。 - Eric O. LebigotM[i, j<i] == 0
,即矩阵在左下角以下为零。维基百科“Upper triangular”页面中有一些例子。 - Eric O. Lebigot