我正在使用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库中看到了一些提到三角矩阵的函数,但它们似乎围绕从完整矩阵中获取三角矩阵。在我的情况下,(我认为)我已经有了一个三角矩阵,并且想要操纵它。
非常感谢。
答案 0 :(得分:1)
我会说你不能吃蛋糕而且也吃它:如果你想要有效的存储,你就不能存储完整的行(如你所说);如果你想要有效的行访问,我会说你必须存储完整的行。
虽然真实的表现取决于您的应用,但您可以检查以下方法是否适合您:
您使用Scipy's sparse matrices进行有效存储。
您自动对齐矩阵(StackOverflow上有small recipe,至少在常规矩阵上有效。)
然后您可以访问其行(或列);这是否有效取决于稀疏矩阵的实现......