Determinación de valores duplicados en una matriz
Supongamos que tengo una matriz
a = np.array([1, 2, 1, 3, 3, 3, 0])
¿Cómo puedo (eficientemente, Pythonically) encontrar qué elementos dea
¿Son duplicados (es decir, valores no únicos)? En este caso el resultado seríaarray([1, 3, 3])
o posiblementearray([1, 3])
si es eficiente
He ideado algunos métodos que parecen funcionar:
Enmascaramientom = np.zeros_like(a, dtype=bool)
m[np.unique(a, return_index=True)[1]] = True
a[~m]
Establecer operacionesa[~np.in1d(np.arange(len(a)), np.unique(a, return_index=True)[1], assume_unique=True)]
Este es lindo pero probablemente ilegal (comoa
no es realmente único):
np.setxor1d(a, np.unique(a), assume_unique=True)
Histogramasu, i = np.unique(a, return_inverse=True)
u[np.bincount(i) > 1]
Clasificacións = np.sort(a, axis=None)
s[:-1][s[1:] == s[:-1]]
Pandass = pd.Series(a)
s[s.duplicated()]
¿Hay algo que me haya perdido? No necesariamente estoy buscando una solución de solo numpy, pero tiene que funcionar con tipos de datos de numpy y ser eficiente en conjuntos de datos de tamaño medio (hasta 10 millones de tamaño).
ConclusionesPruebas con un conjunto de datos de 10 millones de tamaño (en un Xeon de 2.8GHz):
a = np.random.randint(10**7, size=10**7)
Lo más rápido es clasificar, a 1.1s. Lo dudosoxor1d
ocupa el segundo lugar en 2.6 s, seguido de enmascaramiento y pandasSeries.duplicated
en 3.1s,bincount
en 5.6s, yin1d
y de senderlesetdiff1d
ambos a los 7.3s. De StevenCounter
es solo un poco más lento, a 10.5s; detrás de Burhan estánCounter.most_common
a 110s y DSM'sCounter
Resta a 360s.
Voy a utilizar la clasificación para el rendimiento, pero acepto la respuesta de Steven porque el rendimiento es aceptable ysiente Más claro y más pitónico.
Edición: descubrió la solución de Pandas. Si Pandas está disponible, es claro y funciona bien.