Ho una matrice sparsa di grandi dimensioni e voglio ottenere il valore massimo per ogni riga. In numpy, posso chiamare numpy.max (mat, axis = 1), ma non riesco a trovare una funzione simile per la matrice sparsa scipy. Esiste un modo efficace per ottenere il massimo di ogni riga per una matrice sparsa di grandi dimensioni?modo efficiente per ottenere il massimo di ogni riga per matrice sparse di grandi dimensioni
6
A
risposta
4
Se la matrice, consente di chiamare a
, vengono memorizzati in formato CSR, quindi a.data
ha tutte le voci non nulli ordinati per righe e a.indptr
ha l'indice del primo elemento di ogni riga. È possibile utilizzare questo per calcolare ciò che si è dopo come segue:
def sparse_max_row(csr_mat):
ret = np.maximum.reduceat(csr_mat.data, csr_mat.indptr[:-1])
ret[np.diff(csr_mat.indptr) == 0] = 0
return ret
2
Mi sono imbattuto in questo stesso problema. La soluzione di Jaime si interrompe se una qualsiasi delle righe nella matrice è completamente vuota. Ecco una soluzione:
def sparse_max_row(csr_mat):
ret = np.zeros(csr_mat.shape[0])
ret[np.diff(csr_mat.indptr) != 0] = np.maximum.reduceat(csr_mat.data,csr_mat.indptr[:-1][np.diff(csr_mat.indptr)>0])
return ret
questo viene a mancare quando nessuna delle voci di dati sono superiori a 0: https://gist.github.com/jni/6120922#file-example-py – Juan