【问题标题】:Scipy sparse triangular matrix?Scipy稀疏三角矩阵?
【发布时间】:2011-03-07 15:08:00
【问题描述】:

我正在使用 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 库中看到了一些提到三角矩阵的函数,但它们似乎围绕着从完整矩阵中获取三角矩阵。就我而言,(我认为)我已经有一个三角矩阵,并且想要对其进行操作。

非常感谢。

【问题讨论】:

  • 它被称为三角形上包装存储fiy。我认为没有有效的方法可以从三角矩阵中获取整列或整行。
  • M[i, j]==M[j, i] 表示矩阵是对称的,不是三角形的。
  • @EOL 好点。虽然根据维基百科的定义,这个矩阵也是(上)三角形的。
  • 供您参考:上三角不同于对称:它的意思是M[i, j<i] == 0,即矩阵在左下三角中有零……维基百科页面中有关于“上三角”矩阵的示例.

标签: python matrix scipy


【解决方案1】:

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

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

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

  2. 您会自动对称您的矩阵(StackOverflow 上有一个 small recipe,它至少适用于常规矩阵)。

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

【讨论】:

  • 我害怕那个。不过,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2017-03-26
  • 2017-03-31
  • 2023-04-10
  • 2017-07-21
  • 2011-11-28
  • 2017-07-02
相关资源
最近更新 更多