【问题标题】:The most efficient way to store large symmetric sparse matrices in python在 python 中存储大型对称稀疏矩阵的最有效方法
【发布时间】:2011-11-05 17:29:27
【问题描述】:

我正在起草/测试我设计的一种技术,用于解决速度和效率的微分方程。

这将需要存储、操作、调整大小,并且(在某些时候)可能对非常大的稀疏矩阵进行对角化。我希望能够有由零和几个(比如

我认为拥有 gpu 加速会很有用——所以任何关于利用它的最佳方式的建议也将不胜感激(比如 pycuda、theano 等)

【问题讨论】:

  • 矩阵有多大?你调查过 numpy 吗?
  • 或试试scipy.sparse?
  • 我期待这样的事情:stackoverflow.com/questions/1053928/…
  • 我用过 numpy 和一点 scipy。我主要想检查这些确实是最具可扩展性的选项 - 以及有关使用 gpu 的任何提示。

标签: python matrix numpy sparse-matrix


【解决方案1】:

对称稀疏矩阵最有效的存储方法可能是sparse skyline format(例如,这是英特尔 MKL 使用的方法)。 AFAIK scipy.sparse 不包含稀疏的对称矩阵格式。 Pysparse,然而,does。使用 Pysparse,您可以使用链接列表格式增量构建矩阵,然后将矩阵转换为稀疏天际线格式。在性能方面,我通常发现 Pysparse 在大型稀疏系统和所有基本构建块(矩阵乘积、特征值求解器、直接求解器、迭代求解器)上都优于 scipy,尽管例程的范围可能会小一些比 scipy 中可用的。

【讨论】:

    【解决方案2】:

    您可以使用字典和元组来访问数据:

    >>> size = (4,4)
    >>> mat = {}
    >>> mat[0,1] = 3
    >>> mat[2,3] = 5
    >>> for i in range(size[0]):
            for j in range(size[1]):
                print mat.get((i,j), 0) ,
            print
    
    0 3 0 0
    0 0 0 0
    0 0 0 5
    0 0 0 0
    

    当然你应该为此创建一个类并添加你需要的方法:

    class Sparse(dict):
        pass
    

    顺便说一句,您也可以使用 scipy 库中的 scipy.sparse

    【讨论】:

    • 好的,如果这样最有效,那就这样吧。谢谢,我主要是想检查晦涩的答案。
    • 我会再给这个问题一个小时左右,看看是否会弹出任何其他答案,然后我会将其标记为已解决。谢谢。
    • @Feynman 稀疏矩阵类应该覆盖__getitem__ 方法,以便在没有数据时返回零
    • 感谢您的提示。我对python还是很陌生。我一定会覆盖 getitem 方法。我想我会将 Sparse 类基于 scipy sparse 类并修改一些内置的东西。
    【解决方案3】:

    使用scipy.sparse

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2012-10-14
      • 2018-06-28
      • 2013-06-09
      • 2012-06-17
      • 1970-01-01
      相关资源
      最近更新 更多