Was mit der verknüpften Antwort falsch ist? Funktioniert es in Ihrem Fall nicht? oder du verstehst es einfach nicht? Oder ist es nicht effizient genug?
Ich schlug vor, ein Mittel zum Auffinden der oberen Werte für eine Zeile einer lil
Format-Matrix, und wenden Sie diese Zeile für Zeile. Aber ich würde nur meine frühere Antwort wiederholen.
OK, war meine Antwort ein Anfang, aber es fehlte ein paar Details über das lol
Format auf iterieren. Hier ist ein Anfang; es könnte wahrscheinlich aufgeräumt werden.
das Array und eine lil
Version:
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()
Die Zeilenfunktion aus der vorherigen Antwort:
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
Iterate über die Zeilen von arr_ll
, diese Funktion anzuwenden und die Elemente ersetzen:
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]])
In der lil
Format werden die Daten in 2 Objekttyp-Arrays als Unterlisten gespeichert, eines mit den Datennummern, das andere mit den Spaltenindizes.
Das Anzeigen der Datenattribute von Sparse-Matrix ist praktisch, wenn Sie neue Dinge tun. Das Ändern dieser Attribute birgt ein gewisses Risiko, da es das gesamte Array durcheinanderbringt. Aber es sieht so aus, als könnte das lil
Format so sicher optimiert werden.
Das Format csr
ist besser für den Zugriff auf Zeilen als csc
. Es ist Daten in 3 Arrays gespeichert, data
, indices
und indptr
. Das lil
-Format teilt effektiv 2 dieser Arrays in Teillisten basierend auf Informationen in der indptr
. csr
ist großartig für Mathe (Multiplikation, Addition usw.), aber nicht so gut, wenn die Sparsity geändert wird (indem man Werte ungleich Null in Nullen umwandelt).
Wäre es in Ordnung, Sie zu fragen, wie Sie es mit lil machen würden? Ich habe deine ausführliche Antwort gelesen, konnte sie aber nicht lösen. – istern