首先,企業社會責任矩陣具有.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()
可能是必要的,我不知道什麼樣的操作會使它有必要。
我不確定是否理解複製矩陣(示例1)和複製數據(示例2)之間的區別。每種方法的含義是什麼? – Zach
沒有真正的區別。在第二種情況下,您只需保存X.indptr和X.indices的副本,如果內存真的很短,它可能是一個重點,它也應該快一點。但通常我會使用第一個選項,因爲我認爲其他只是不必要的魔法。 – seberg
@Zach添加了'.multiply'方法,對於這個問題,我認爲這非常好。 – seberg