Scipy稀疏三角矩阵?

时间:2010-06-24 03:38:34

标签: python matrix scipy

我正在使用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 个答案:

答案 0 :(得分:1)

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

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

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

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

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