有什麼不對所鏈接的答案嗎?你的情況不起作用嗎?或者你只是不明白它?或者它不是高效夠了嗎?
我打算建議找出一種方法找到一排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
,indices
和indptr
。根據indptr
中的信息,lil
格式將這些數組中的2個有效地分割成子列表。 csr
非常適合數學(乘法,加法等),但在改變稀疏度時不太好(將非零值變爲零)。
你可以問你如何使用lil來做它嗎?我已閱讀您的詳細答案,但無法解決問題。 – istern