代码之家  ›  专栏  ›  技术社区  ›  PhilS

向scipy.sparse.dok_矩阵添加numpy数组

  •  4
  • PhilS  · 技术社区  · 15 年前

    我有一个 scipy.sparse.dok_matrix (尺寸m x n),希望添加长度为m的扁平numpy数组。

    for col in xrange(n):
        dense_array = ...
        dok_matrix[:,col] = dense_array
    

    但是,此代码在中引发异常 dok_matrix.__setitem__ 当它试图删除一个不存在的密钥时( del self[(i,j)] )

    所以,现在我做这件事的方式是不合法的:

    for col in xrange(n):
        dense_array = ...
        for row in dense_array.nonzero():
            dok_matrix[row, col] = dense_array[row]
    

    这个 感觉 效率很低。 那么,最有效的方法是什么呢?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  2
  •   Justin Peel    15 年前

    我很惊讶,你的不发达的方式没有同样的问题切片方式。在我看来,这看起来像是一个错误,因为我看到的是弯弯曲曲的代码。当您试图将dok_矩阵中的某一行和某一列设置为零(当它已经为零时)时,会出现一个错误,因为它试图删除该行和该列的值,而不检查它是否存在。

    回答你的问题,你不雅的行为正是 __setitem__ 方法目前使用的是您的优雅方法(经过几次IsInstance检查以及其他检查)。如果你想用优雅的方式,你可以通过打开dok.py来修复我在你自己的scipy包中提到的bug。 Lib/site-packages/scipy/sparse/ 把222号线从

    if value==0:
    

    if value==0 and self.has_key((i,j)):
    

    然后你可以使用优雅的方式,它应该工作得很好。我去提交了一个bug修复程序,但是下一个版本已经修复了这个问题,这就是修复它的方法。

        2
  •  1
  •   Pablo Antolin    14 年前

    我想这个问题已经解决了 Scipy 0.8.0