2010-04-20 89 views
4

我有一個scipy.sparse.dok_matrix(尺寸m x n),想要添加一個長度爲m的平坦numpy數組。添加一個numpy數組到一個scipy.sparse.dok_matrix

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

然而,當它試圖刪除一個非現有密鑰(del self[(i,j)])這個代碼在引發dok_matrix.__setitem__異常。

所以,現在我做這個unelegant方式:

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

感覺非常ineffecient。 那麼,做這件事最有效的方法是什麼?

謝謝!

回答

2

我很驚訝你的不高雅的方式並沒有像切片一樣的問題。這看起來像是一個看着Scipy代碼的bug。當您嘗試將dok_matrix中的特定行和列設置爲零(當它已爲零時)時,會出現錯誤,因爲它會嘗試刪除該行和列中的值而不檢查其是否存在。

在回答你的問題時,你用你卑鄙的方式所做的事情正是__setitem__方法當前用你的優雅方法所做的事情(在幾次實例檢查之後)。如果你想用優雅的方式,你可以解決我在自己的SciPy的包提到由

if value==0: 

Lib/site-packages/scipy/sparse/開放dok.py和變化的線路222

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

隨後的bug你可以使用優雅的方式,它應該工作得很好。我去提交一個錯誤修復程序,但是它已經被修復用於下一個版本,這是它修復的方式。

+0

的「unelegant」的方式篩選出的零和'dense_array.nonzeros()'在dok_matrix插入值之前,這就是爲什麼它不會崩潰。 非常感謝! – PhilS 2010-04-20 17:47:46

+0

Doh,錯過了,但很高興我能幫上忙。 – 2010-04-20 17:53:09

+0

side-note:我認爲上面在'dok.py'中顯示的代碼是錯誤的,因爲如果密鑰(i,j)還不存在,則在'dok_matrix'中設置零值。我打開了一張票(http://projects.scipy.org/scipy/ticket/1160)。 此外,如果'dense_array'稀疏,我的「不優雅」的方式會更好,因爲只有非零值必須被檢查和插入('__setitem__'只爲他們調用)。所以我堅持我的舊版本,雖然你提到的那個更漂亮... – PhilS 2010-04-21 08:44:53

1

我認爲,這個錯誤已被固定在Scipy 0.8.0

+0

是的,的確如此。 – PhilS 2010-09-06 18:59:03