Ich habe eine dünne Matrix in csr_matrix Format. Für jede Zeile muss ich den Zeilenmittelwert von den Nicht-Null-Elementen subtrahieren. Die Mittelwerte müssen anhand der Anzahl der von Null verschiedenen Elemente der Zeile berechnet werden (anstelle der Länge der Zeile). ich einen schnellen Weg gefunden, um die Zeile zu berechnen bedeutet, mit dem folgenden Code:scipy.sparse Matrix: subtrahieren Zeile Mittelwert zu ungleich Null Elemente
# M is a csr_matrix
sums = np.squeeze(np.asarray(M.sum(1))) # sum of the nonzero elements, for each row
counts = np.diff(M.tocsr().indptr) # count of the nonzero elements, for each row
# for the i-th row the mean is just sums[i]/float(counts[i])
Das Problem der Teil-Updates ist. Ich brauche einen schnellen Weg, dies zu tun. Eigentlich, was ich tue, ist M zu einem lil_matrix und führen Sie die Updates auf diese Weise zu transformieren:
M = M.tolil()
for i in xrange(len(sums)):
for j in M.getrow(i).nonzero()[1]:
M[i, j] -= sums[i]/float(counts[i])
, die langsam ist. Irgendwelche Vorschläge für eine schnellere Lösung?
Ich würde versuchen, die Zeile zu replizieren bedeutet 'np.repeat' und' counts' verwenden und Unter, die direkt von 'M.data' Array. – hpaulj