¿Qué hace esto: s == s ] en numpy?

He estado buscando una forma de verificar de manera eficiente los duplicados en una matriz numpy y me encontré con una pregunta que contenía una respuesta utilizando este código.

¿Qué significa esta línea en numpy?

s[s[1:] == s[:-1]] 

Me gustaría entender el código antes de aplicarlo. Miró en el documento de Numpy pero tuvo problemas para encontrar esta información.

Los segmentos [1:] y [:-1] significan todos menos los primeros y todos menos los últimos elementos de la matriz:

 >>> import numpy as np >>> s = np.array((1, 2, 2, 3)) # four element array >>> s[1:] array([2, 2, 3]) # last three elements >>> s[:-1] array([1, 2, 2]) # first three elements 

por lo tanto, la comparación genera una matriz de comparaciones booleanas entre cada elemento s[x] y su “vecino” s[x+1] , que será una más corta que la matriz original (ya que el último elemento no tiene vecino):

 >>> s[1:] == s[:-1] array([False, True, False], dtype=bool) 

y al usar esa matriz para indexar la matriz original, obtienes los elementos donde la comparación es True , es decir, los elementos que son iguales a sus vecinos:

 >>> s[s[1:] == s[:-1]] array([2]) 

Tenga en cuenta que esto solo identifica valores duplicados adyacentes .

Mira esto:

 >>> s=numpy.array([1,3,5,6,7,7,8,9]) >>> s[1:] == s[:-1] array([False, False, False, False, True, False, False], dtype=bool) >>> s[s[1:] == s[:-1]] array([7]) 

Así que s[1:] da todos los números excepto el primero, y s[:-1] todos menos el último. Ahora compare estos dos vectores, por ejemplo, mire si dos elementos adyacentes son iguales. Por último, seleccione estos elementos.

s[1:] == s[:-1] compara s sin el primer elemento con s sin el último elemento, es decir, 0th con 1st, 1st con 2nd etc, lo que le da una variedad de len(s) - 1 elementos booleanos. s[boolarray] seleccionará solo aquellos elementos de s que tengan True en el lugar correspondiente en boolarray . Por lo tanto, el código extrae todos los elementos que son iguales al siguiente elemento.

Mostrará duplicados en una matriz ordenada.

Básicamente, la expresión interna s[1:] == s[:-1] compara la matriz con su versión modificada. Imagina esto:

 1, [2, 3, ... n-1, n ] - [1, 2, ... n-2, n-1] n => [F, F, ... F, F ] 

En una matriz ordenada, no habrá True en la matriz resultante a menos que haya repetición. Luego, esta expresión s[array] filtra las que tienen True en el array índice.