首页 文章

Scipy稀疏三角矩阵?

提问于
浏览
7

我正在使用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库中看到了一些提到三角矩阵的函数,但它们似乎围绕从完整矩阵中获取三角矩阵 . 在我的情况下,(我认为)我已经有了一个三角矩阵,并且想要操纵它 .

非常感谢 .

1 回答

  • 1

    我会说你不能吃蛋糕并且也吃它:如果你想要有效的存储,你就不能存储完整的行(如你所说);如果你想要有效的行访问,我会说你必须存储完整的行 .

    虽然真正的表现取决于您的应用程序,但您可以检查以下方法是否适合您:

    • 您使用Scipy's sparse matrices进行有效存储 .

    • 您自动对齐矩阵(StackOverflow上有small recipe,至少在常规矩阵上有效) .

    • 然后,您可以访问其行(或列);这是否有效取决于稀疏矩阵的实现......

相关问题