2017-04-14 9 views
1

Ich habe eine 3-Spalten-Array. Die erste Spalte des Arrays hat Werte zwischen 1 und 10. Ich muss alle Zeilen extrahieren, in denen die erste Spalte 1 ist und die dritte Spalte dieses Array-Segments normalisieren. Dann wiederholen Sie das gleiche für alle Zeilen, für die die erste Spalte gleich 2 usw.Normalisieren Schichten eines NDarray

Wenn ich diesen Code ausführen, läßt es das Array unverändert:

for u in np.unique(x[:,0]): 
    mask= x[:, 0] == u 
    x[mask][:,2]=x[mask][:,2]/np.sum((x[mask][:,2])) 

Wenn ich ausführen, um dieses andere Stück Code , Ich sehe, dass r (ich legte einen Druck r in der Schleife) tatsächlich genau so arbeiten, wie ich will. Der einzige Punkt ist, dass das ursprüngliche Array x unverändert bleibt.

for u in np.unique(x[:,0]): 
    r = x[x[:, 0] == u] 
    r[:,2]=r[:,2]/np.sum((x[x[:,0]==u][:,2])) 

Warum ist das? Was mache ich falsch???

Antwort

1

Hier ist ein alternativer vektorisiert Ansatz mit Leistung im Verstand Ihr Problem mit np.unique und np.bincount zu lösen -

tags = np.unique(x[:,0], return_inverse=1)[1] 
x[:,2] /= np.bincount(tags, x[:,2])[tags] 

Um weiter zu steigern der Leistung, kann man die Verwendung vermeiden von np.unique und berechnet direkt das Äquivalent von np.bincount(tags, xc[:,2]), wobei man die Tatsache ausnutzt, dass die Zahlen in der ersten Spalte zwischen 1 und 10 mit t liegen sein -

np.bincount(xc[:,0].astype(int), xc[:,2], minlength=11)[1:] 

tags zu ersetzen, könnten wir die erste Spalte, wie so verwenden -

tags = xc[:,0].astype(int)-1 
+0

Danke Kumpel! – user3623123

1

Nicht zweimal indizieren. Anscheinend wird dann eine Kopie des Quell-Arrays erstellt. Verwenden x[mask,2] statt x[mask][:,2]:

for u in np.unique(x[:,0]): 
    mask= x[:, 0] == u 
    x[mask,2]=x[mask,2]/np.sum((x[mask,2])) 
+0

Sie richtig sind. Mein Fehler!!! Danke Kumpel – user3623123

Verwandte Themen