Ho provato a inizializzare csc_matrix
e csr_matrix
da un elenco di valori (data, (rows, cols))
come suggerisce la documentazione.Ignorare le voci duplicate nella matrice sparse
sparse = csc_matrix((data, (rows, cols)), shape=(n, n))
Il problema è che, il metodo che in realtà sono per generare i vettori data
, rows
e cols
introduce duplicati per alcuni punti. Per impostazione predefinita, scipy aggiunge i valori delle voci duplicate. Tuttavia, nel mio caso, quei duplicati hanno esattamente lo stesso valore in data
per un dato (row, col)
.
Quello che sto cercando di ottenere è di far scipy ignorare la seconda voce se ne esiste già una, invece di aggiungerle.
Ignorando il fatto che potrei migliorare l'algoritmo di generazione per evitare di generare duplicati, c'è un parametro o un altro modo di creare una matrice sparsa che ignora i duplicati?
Attualmente due voci con data = [4, 4]; cols = [1, 1]; rows = [1, 1];
generare una matrice sparsa cui valore è (1,1)
8
mentre il valore desiderato è 4
.
>>> c = csc_matrix(([4, 4], ([1,1],[1,1])), shape=(3,3))
>>> c.todense()
matrix([[0, 0, 0],
[0, 8, 0],
[0, 0, 0]])
Sono anche consapevole del fatto che io potessi filtrare utilizzando un 2-dimensionale funzione NumPy unique
, ma le liste sono abbastanza grandi, quindi questo non è davvero un'opzione valida.
Altre possibili risposte alla domanda: esiste un modo per specificare cosa fare con i duplicati? vale a dire mantenendo min
o max
anziché il valore predefinito sum
?
Sono quasi sicuro che la risposta è no, non esiste un modo integrato di modificare il comportamento per i duplicati. Non dovresti essere troppo veloce a scartare l'uso di 'np.unique' però: non importa quanto siano grandi le tue liste, scipy le convertirà in array e farà operazioni simili sotto il cofano, quindi non c'è ragione per cui tu non dovrebbe tentare di – Jaime
'np.unique' è 1d, quindi la gestione di queste coordinate 2D richiederà uno sforzo extra. – hpaulj
Vero, ma trucchi come [questo] (http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array) lo rendono 2D. –