【发布时间】:2011-03-07 15:08:00
【问题描述】:
我正在使用 Scipy 使用 scipy.sparse.lil_matrix 构建一个大型的稀疏 (250k X 250k) 共现矩阵。共现矩阵是三角形的;也就是说,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 库中看到了一些提到三角矩阵的函数,但它们似乎围绕着从完整矩阵中获取三角矩阵。就我而言,(我认为)我已经有一个三角矩阵,并且想要对其进行操作。
非常感谢。
【问题讨论】:
-
它被称为三角形上包装存储fiy。我认为没有有效的方法可以从三角矩阵中获取整列或整行。
-
M[i, j]==M[j, i]表示矩阵是对称的,不是三角形的。 -
@EOL 好点。虽然根据维基百科的定义,这个矩阵也是(上)三角形的。
-
供您参考:上三角不同于对称:它的意思是
M[i, j<i] == 0,即矩阵在左下三角中有零……维基百科页面中有关于“上三角”矩阵的示例.