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 Nmehrmals 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 numpynur ist. Wenn Sie numbajedoch 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 numbaes ein No-Go ist, ist Divakars Antwort auch einen Blick wert!
