Scipy稀疏三角矩阵?

gil*_*esc 8 python matrix scipy

我正在使用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]
Run Code Online (Sandbox Code Playgroud)

所以,考虑到上面的矩阵,我希望能够做一个类似的查询M[1],然后回来[2,5,6,7].我有两个问题:

1)有没有比首先查询行,然后是列,然后连接两个更有效(最好是内置)的方法呢?这很糟糕,因为无论我使用CSC(基于列)还是CSR(基于行)内部表示,两个查询之一效率都非常低.

2)我甚至使用Scipy的正确部分?我在Scipy库中看到了一些提到三角矩阵的函数,但它们似乎围绕从完整矩阵中获取三角矩阵.在我的情况下,(我认为)我已经有了一个三角矩阵,并且想要操纵它.

非常感谢.

Eri*_*got 2

我想说,鱼和熊掌不可兼得:如果你想要高效的存储,你就不能存储整行(正如你所说);如果您想要高效的行访问,我会说您必须存储完整的行。

\n\n

虽然实际性能取决于您的应用程序,但您可以检查以下方法是否适合您:

\n\n
    \n
  1. 您可以使用Scipy 的稀疏矩阵来实现高效存储。

  2. \n
  3. 你会自动对称化你的矩阵(StackOverflow 上有一个小窍门,至少适用于常规矩阵)。

  4. \n
  5. 然后您可以访问其行(或列);这是否有效取决于稀疏矩阵\xe2\x80\xa6的实现

  6. \n
\n