我有一个 scipy.sparse.dok_matrix
(尺寸为 m x n),想要添加一个长度为 m 的平面 numpy 数组。
for col in xrange(n):
dense_array = ...
dok_matrix[:,col] = dense_array
但是,此代码在尝试删除不存在的键 (del self[(i,j)]
) 时在 dok_matrix.__setitem__
中引发异常。
所以,现在我正在以不优雅的方式进行此操作:
for col in xrange(n):
dense_array = ...
for row in dense_array.nonzero():
dok_matrix[row, col] = dense_array[row]
这感觉非常低效。 那么,最有效的方法是什么?
谢谢!
最佳答案
令我惊讶的是,您这种不优雅的方式并没有出现与 slice 方式相同的问题。在查看 Scipy 代码时,这对我来说看起来像是一个错误。当您尝试将 dok_matrix 中的特定行和列设置为零时,当它已经为零时,会出现错误,因为它会在不检查该行和列是否存在的情况下尝试删除该值。
在回答您的问题时,您以不优雅的方式所做的正是 __setitem__
方法当前使用您的优雅方法所做的事情(经过几次 isinstance 检查之后等等)。如果你想使用优雅的方式,你可以修复我在你自己的 Scipy 包中提到的错误,方法是打开 Lib/site-packages/scipy/sparse/
中的 dok.py 并将第 222 行从
if value==0:
到
if value==0 and self.has_key((i,j)):
然后你可以使用优雅的方式,它应该工作得很好。我去提交了一个错误修复,但它已经为下一个版本修复了,这就是它修复的方式。
关于python - 将 numpy 数组添加到 scipy.sparse.dok_matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2674437/