将numpy数组添加到scipy.sparse.dok_matrix中
我有一个 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 个回答
1
我觉得这个问题在 Scipy 0.8.0 版本中已经修复了。
2
我很惊讶你那种不太优雅的方法居然没有和切片方法一样的问题。看起来这在Scipy的代码里是个bug。当你试图把一个已经是零的dok_matrix中的某一行某一列设置为零时,会出现错误,因为它在删除那行那列的值时没有检查这个值是否存在。
回答你的问题,你用的不太优雅的方法其实和你优雅的方法现在的__setitem__
方法做的事情是一样的(只是多了一些类型检查之类的)。如果你想用优雅的方法,你可以通过打开Lib/site-packages/scipy/sparse/
中的dok.py来修复我提到的bug,把第222行从
if value==0:
改成
if value==0 and self.has_key((i,j)):
这样你就可以使用优雅的方法了,应该没问题。我本来想提交一个bug修复,但发现下一个版本已经修复了,而这就是修复的方式。