2016-03-21 71 views
1

在閱讀this類似的問題後,我仍然無法完全理解如何去實施解決方案即時尋找。我有一個稀疏矩陣,即:在scipy稀疏矩陣中獲取每行的前n項

import numpy as np 
from scipy import sparse 
arr = np.array([[0,5,3,0,2],[6,0,4,9,0],[0,0,0,6,8]]) 
arr_csc = sparse.csc_matrix(arr) 

我想有效獲得前n項的每一行的,而稀疏矩陣轉換爲密。 最終的結果應該是這樣的(假設N = 2):

top_n_arr = np.array([[0,5,3,0,0],[6,0,0,9,0],[0,0,0,6,8]]) 
top_n_arr_csc = sparse.csc_matrix(top_n_arr) 

回答

1

有什麼不對所鏈接的答案嗎?你的情況不起作用嗎?或者你只是不明白它?或者它不是高效夠了嗎?

我打算建議找出一種方法找到一排lil格式矩陣的最高值,然後逐行應用。但我只是重複我早先的答案。


OK,我以前的答案是一個開始,但缺乏對通過lol格式迭代的一些細節。這是一個開始;它可能可以清理。

使數組和lil版本:

In [42]: arr = np.array([[0,5,3,0,2],[6,0,4,9,0],[0,0,0,6,8]])  
In [43]: arr_sp=sparse.csc_matrix(arr) 
In [44]: arr_ll=arr_sp.tolil() 

從以前的答案行功能:

def max_n(row_data, row_indices, n): 
     i = row_data.argsort()[-n:] 
     # i = row_data.argpartition(-n)[-n:] 
     top_values = row_data[i] 
     top_indices = row_indices[i] # do the sparse indices matter? 
     return top_values, top_indices, i 

迭代的arr_ll行,應用此功能,替換元素:

In [46]: for i in range(arr_ll.shape[0]): 
    d,r=max_n(np.array(arr_ll.data[i]),np.array(arr_ll.rows[i]),2)[:2] 
    arr_ll.data[i]=d.tolist() 
    arr_ll.rows[i]=r.tolist() 
    ....:  

In [47]: arr_ll.data 
Out[47]: array([[3, 5], [6, 9], [6, 8]], dtype=object) 

In [48]: arr_ll.rows 
Out[48]: array([[2, 1], [0, 3], [3, 4]], dtype=object) 

In [49]: arr_ll.tocsc().A 
Out[49]: 
array([[0, 5, 3, 0, 0], 
     [6, 0, 0, 9, 0], 
     [0, 0, 0, 6, 8]]) 

lil格式,數據存儲在2個對象類型數組中,作爲子列表,一個數據編號,另一個列索引。

查看稀疏矩陣的數據屬性在做新事物時非常方便。改變這些屬性有一定的風險,因爲它搞亂了整個陣列。但它看起來像lil格式可以像這樣安全地調整。

csr格式比csc更適合訪問行。它的數據存儲在3個數組中,data,indicesindptr。根據indptr中的信息,lil格式將這些數組中的2個有效地分割成子列表。 csr非常適合數學(乘法,加法等),但在改變稀疏度時不太好(將非零值變爲零)。

+0

你可以問你如何使用lil來做它嗎?我已閱讀您的詳細答案,但無法解決問題。 – istern