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:

Enmascaramiento
m = np.zeros_like(a, dtype=bool)
m[np.unique(a, return_index=True)[1]] = True
a[~m]
Establecer operaciones
a[~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)
Histogramas
u, i = np.unique(a, return_inverse=True)
u[np.bincount(i) > 1]
Clasificación
s = np.sort(a, axis=None)
s[:-1][s[1:] == s[:-1]]
Pandas
s = 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).

Conclusiones

Pruebas 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.

Respuestas a la pregunta(8)

Su respuesta a la pregunta