2017-02-23 163 views
2

我有一個非常大的稀疏csc_matrixx。我想對它做elementwise exp()。基本上我想得到的結果與我在numpy.exp(x.toarray())中得到的結果相同。但我不能這樣做(我的記憶不會允許我將稀疏矩陣轉換爲數組)。有什麼出路嗎?提前致謝!元智慧exp()的scipy稀疏矩陣

+0

如果您無法以高密度格式保存輸入,您將無法保存輸出;由於e^0 = 1,輸出不會稀疏。 – user2357112

回答

5

如果你沒有內存容納x.toarray(),你沒有內存來保存你要求的輸出。輸出不會稀疏;事實上,除非你的輸入中有負無窮大,輸出可能不會有單一的0

它可能會是更好的計算EXP(X)-1,這是因爲

一樣簡單
x.expm1() 
+0

是的,你說得對。但是,我怎麼能只爲非零值呢? –

+1

那是什麼?稀疏矩陣包含所有碰巧將零映射爲零的numpy函數?有一個我不會期望的功能! –

+0

是的,'scipy/sparse/data.py'有一個代碼塊,用於將#func(0)= 0的numpy一元ufuncs添加到_data_matrix.'中。關鍵是能夠訪問'.data'屬性,並使用'_with_data'方法創建一個新的矩陣。我也沒有意識到這一點。 – hpaulj

3

如果您只想在非網絡上執行某些操作:data屬性至少在某些表示中可寫,包括csrcsc。某些表示允許重複輸入,因此請確保您採取的是「正常化」形式。

+0

是的,這就是我想到的。無論如何,我會讓我的手髒! –

0

要更改非零元素,也許這會爲你工作:

x = some big sparse matrix 
np.exp(x.data, out=x.data) # ask np.exp() to store results in existing x.data 

大概要慢

# above seems more efficient (no new memory alloc). 
x.data = np.exp(x.data) 

我一直在冥思苦想如何獲得元素之每個非零數組元素的log2()。我最終做了像下面這樣做:

np.log2(x.data, out=x.data) 

以下兩種技術看起來像我正在尋找的。我的矩陣很稀疏,但它仍然有很多非零元素。

感謝@DSM here直接更改x.data的想法,我認爲這是對稀疏矩陣的一個非常好的見解。

歸功於@Mike Müller爲使用「出」作爲自己的想法。在同一個線程中,@kmario23指出了一個關於將.data提升爲float(輸入可以是int或者smth)的重要警告,所以它與.exp()或者其他函數兼容,如果我寫的是spath供一般使用。

說明:我剛開始學習稀疏矩陣,所以想知道這是否是一個不好的主意,因爲我沒有看到。如果我在這個薄冰上,請讓我知道。

通常我不會惹私密屬性,但是.data在我看過的各種稀疏矩陣的attributes documentation中顯示得很清楚。