gegeben ein Array von ganzen Zahlen wie
[1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5]
Ich muss Elemente maskieren, die sich N
mehrmals wiederholen . Zur Verdeutlichung: Das Hauptziel besteht darin, das boolesche Maskenarray abzurufen und später für Binning-Berechnungen zu verwenden.
Ich habe eine ziemlich komplizierte Lösung gefunden
import numpy as np
bins = np.array([1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5])
N = 3
splits = np.split(bins, np.where(np.diff(bins) != 0)[0]+1)
mask = []
for s in splits:
if s.shape[0] <= N:
mask.append(np.ones(s.shape[0]).astype(np.bool_))
else:
mask.append(np.append(np.ones(N), np.zeros(s.shape[0]-N)).astype(np.bool_))
mask = np.concatenate(mask)
zB geben
bins[mask]
Out[90]: array([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5])
Gibt es einen schöneren Weg, dies zu tun?
EDIT, # 2
Vielen Dank für die Antworten! Hier ist eine schlanke Version von MSeiferts Benchmark-Plot. Danke, dass du mich darauf hingewiesen hast simple_benchmark
. Zeigt nur die 4 schnellsten Optionen an:
Fazit
Die von Florian H vorgeschlagene , von Paul Panzer modifizierte Idee scheint eine großartige Möglichkeit zu sein, dieses Problem zu lösen, da sie ziemlich einfach und numpy
nur ist. Wenn Sie numba
jedoch gut damit umgehen können , übertrifft die Lösung von MSeifert die andere.
Ich habe mich entschieden, die Antwort von MSeifert als Lösung zu akzeptieren, da dies die allgemeinere Antwort ist: Sie behandelt beliebige Arrays mit (nicht eindeutigen) Blöcken aufeinanderfolgender sich wiederholender Elemente korrekt. Falls numba
es ein No-Go ist, ist Divakars Antwort auch einen Blick wert!