2011-08-04 37 views
6

我試圖實現使用SciPy的的稀疏包下面的公式:執行總和

W = x[:,1] * y[:,1].T + x[:,2] * y[:,2].T + ... 

其中x & y是一個n×m的csc_matrix。基本上我想把y的每一列乘以y的每一列,並將得到的n×n矩陣求和在一起。然後我要讓所有非零元素1.

這是我目前實施:

c = sparse.csc_matrix((n, n)) 
    for i in xrange(0,m): 
     tmp = bam.id2sym_thal[:,i] * bam.id2sym_cort[:,i].T 
     minimum(tmp.data,ones_like(tmp.data),tmp.data) 
     maximum(tmp.data,ones_like(tmp.data),tmp.data) 

     c = c + tmp 

此實現具有以下問題:

  1. 內存使用率似乎要爆炸。據我瞭解,內存應該只會增加,因爲C變得稀疏,但我看到循環開始吞噬> 20GB的內存與= 10,000,M = 100,000(每行x & y只有大約60非 - 零元素)。

  2. 我正在使用一個不是很有效的python循環。

我的問題:有沒有更好的方法來做到這一點?控制內存使用率是我首先關心的問題,但讓它變得更快就太好了!

謝謝!

+0

'x [:,i]'會給你'x'的第i列,而不是行 – JoshAdel

+0

@JoshAdel:你是對的,我錯過了,我的意思是說乘以列的x年。我已經更新了這個問題。謝謝! – RussellM

+0

您的等式是內部產品的總和,而不是外部產品。你必須調換'y'的列,而不是'x'。 (或者那個,或者標題是錯誤的。) –

回答

3

注意,外產品在你所描述的方式的總和僅僅是相同兩個矩陣相乘。換句話說,

sum_i X[:,i]*Y[:,i].T == X*Y.T 

所以只需將矩陣乘以一起。

Z = X*Y.T 

對於n = 10000,M = 100000和其中每個列具有在X和Y的一個非零元素,它計算幾乎立即在我的筆記本。

+1

最後一步是將非零元素設置爲1,如Z.data [:] = 1。如果這是OP正在尋找的東西,那麼這個問題不太清楚。謝謝 – eat

+0

這是我一起去的解決方案。這對所有矩陣都是如此,還是取決於向量的稀疏程度?我採用了飲食的建議,並將所有非零元素都設置爲一個。謝謝! – RussellM

+0

令'X = [x1 x2 ... xk]'其中'xi'是n×k矩陣X中的第i列。令Y = [y1 y2 ... yk]其中yi是m-by-k矩陣Y中的第i列。然後對於* any *'X'和'Y','Z = X * YT = sum_i xi * yi.T',其中'Z'是n-m。 –