2012-09-02 74 views
2

如果你有稀疏矩陣X:元素方面的操作

>> print type(X) 
<class 'scipy.sparse.csr.csr_matrix'> 

...你怎麼能總結每個元素的平方每一行,並把它們保存到一個列表?例如:

>>print X.todense() 
[[0 2 0 2] 
[0 2 0 1]] 

你怎麼可以把它轉換成各行的平方和的列表:

[[0²+2²+0²+2²] 
[0²+2²+0²+1²]] 

或: [8, 5]

回答

6

首先,企業社會責任矩陣具有.sum方法(依靠點積)運行良好,所以你需要的是平方。最簡單的解決方法是創建稀疏矩陣的一個副本,方其數據,然後總結一下:

squared_X = X.copy() 
# now square the data in squared_X 
squared_X.data **= 2 

# and sum each row: 
squared_sum = squared_X.sum(1) 
# and delete the squared_X: 
del squared_X 

如果你真的必須節省空間,我想你可以只更換.data再更換回來,東西沿着:

X.sum_duplicate() # make sure, not sure if this happens with normal usage. 
old_data = X.data.copy() 
X.data **= 2 
squared_sum = X.sum(1) 
X.data = old_data 

編輯:居然還有另一種不錯的方式,作爲企業社會責任矩陣具有的elementwise乘法.multiply方法:

squared_sum = X.multiply(X).sum(1) 

增加: 的elementwise操作因此容易通過訪問csr.data,其存儲的值的所有非零元素來完成。 注意:我猜.sum_duplicates()可能是必要的,我不知道什麼樣的操作會使它有必要。

+0

我不確定是否理解複製矩陣(示例1)和複製數據(示例2)之間的區別。每種方法的含義是什麼? – Zach

+1

沒有真正的區別。在第二種情況下,您只需保存X.indptr和X.indices的副本,如果內存真的很短,它可能是一個重點,它也應該快一點。但通常我會使用第一個選項,因爲我認爲其他只是不必要的魔法。 – seberg

+0

@Zach添加了'.multiply'方法,對於這個問題,我認爲這非常好。 – seberg