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库中看到了一些提到三角矩阵的函数,但它们似乎围绕从完整矩阵中获取三角矩阵.在我的情况下,(我认为)我已经有了一个三角矩阵,并且想要操纵它.
非常感谢.
我想说,鱼和熊掌不可兼得:如果你想要高效的存储,你就不能存储整行(正如你所说);如果您想要高效的行访问,我会说您必须存储完整的行。
\n\n虽然实际性能取决于您的应用程序,但您可以检查以下方法是否适合您:
\n\n您可以使用Scipy 的稀疏矩阵来实现高效存储。
你会自动对称化你的矩阵(StackOverflow 上有一个小窍门,至少适用于常规矩阵)。
然后您可以访问其行(或列);这是否有效取决于稀疏矩阵\xe2\x80\xa6的实现