将numpy数组添加到scipy.sparse.dok_matrix中

4 投票
2 回答
1531 浏览
提问于 2025-04-15 21:49

我有一个 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修复,但发现下一个版本已经修复了,而这就是修复的方式。

撰写回答