étant donné un tableau d'entiers comme
[1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5]
J'ai besoin de masquer des éléments qui se répètent plus de N
fois. Pour clarifier: l'objectif principal est de récupérer le tableau de masques booléens, pour l'utiliser plus tard pour les calculs de binning.
J'ai trouvé une solution assez compliquée
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)
donner par exemple
bins[mask]
Out[90]: array([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5])
Existe-t-il une meilleure façon de procéder?
EDIT, # 2
Merci beaucoup pour les réponses! Voici une version mince de l'intrigue de référence de MSeifert. Merci de m'avoir indiqué simple_benchmark
. N'afficher que les 4 options les plus rapides:
Conclusion
L'idée proposée par Florian H , modifiée par Paul Panzer semble être un excellent moyen de résoudre ce problème car elle est assez simple et directe numpy
. numba
Cependant, si vous êtes satisfait de l' utilisation , la solution de MSeifert surpasse l'autre.
J'ai choisi d'accepter la réponse de MSeifert comme solution car c'est la réponse la plus générale: elle gère correctement les tableaux arbitraires avec des blocs (non uniques) d'éléments répétitifs consécutifs. En cas numba
est un non- droit , la réponse de Divakar vaut également le coup d'oeil!