4

我有一个scipy.sparse.dok_matrix(维度 mxn),想要添加一个长度为 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]

感觉非常低效。那么,最有效的方法是什么?

谢谢!

4

2 回答 2

2

我很惊讶你不优雅的方式没有与切片方式相同的问题。在查看 Scipy 代码时,这对我来说似乎是一个错误。当您尝试将 dok_matrix 中的某个行和列设置为零时,它已经为零,会出现错误,因为它会尝试删除该行和列的值而不检查它是否存在。

在回答您的问题时,您以不优雅的方式所做的正是该__setitem__方法当前使用您的优雅方法所做的事情(经过几次 isinstance 检查之后)。Lib/site-packages/scipy/sparse/如果你想使用优雅的方式,你可以通过打开 dok.py并更改第 222 行来修复我在你自己的 Scipy 包中提到的错误

if value==0:

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

然后你可以使用优雅的方式,它应该可以正常工作。我去提交了一个错误修复,但这已经为下一个版本修复了,这就是修复它的方式。

于 2010-04-20T14:55:35.880 回答
1

我认为这个错误已在Scipy 0.8.0中修复

于 2010-09-04T15:58:35.267 回答