python indexing logical-operators indices

python - Encuentra los índices de elementos mayores que x



plt.title size (5)

Dado el siguiente vector,

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

Necesito identificar los índices de "a" cuyos elementos son> = que 4, como esto:

idx = [3, 4, 5, 6, 7, 8]

La información en "idx" se usará para eliminar los elementos de otra lista X (X tiene el mismo número de elementos que "a"):

del X[idx] #idx is used to delete these elements in X. But so far isn''t working.

Escuché que el adormecimiento podría ayudar. ¿Algunas ideas? ¡Gracias!


Lo mas simple en mis ojos seria usar numpy

X[np.array(a)>4]#X needs to be np.array as well

Explicación: np.array convierte a a una matriz.

np.array (a)> 4 proporciona una matriz bool con todos los elementos que deben conservarse

Y la matriz bool filtra X, por lo que solo se seleccionan los elementos donde a es mayor que 4 (y el resto se descarta)


Ok, entiendo lo que quieres decir y una sola línea de Python será suficiente:

usando la lista de comprensión

[ j for (i,j) in zip(a,x) if i >= 4 ] # a will be the list compare to 4 # x another list with same length Explanation: >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> x [''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''j'']

La función Zip devolverá una lista de tuplas

>>> zip(a,x) [(1, ''a''), (2, ''b''), (3, ''c''), (4, ''d''), (5, ''e''), (6, ''f''), (7, ''g''), (8, ''h''), (9, ''j'')]

La comprensión de la lista es un acceso directo para hacer un bucle en un elemento sobre la lista que después de "en", y evaluar el elemento con expresión, luego devolver el resultado a una lista, también puede agregar una condición sobre el resultado que desea devolver

>>> [expression(element) for **element** in **list** if condition ]

Este código no hace nada más que devolver todos los pares que se cerraron.

>>> [(i,j) for (i,j) in zip(a,x)] [(1, ''a''), (2, ''b''), (3, ''c''), (4, ''d''), (5, ''e''), (6, ''f''), (7, ''g''), (8, ''h''), (9, ''j'')]

Lo que hacemos es agregar una condición en él especificando "if" seguido de una expresión booleana

>>> [(i,j) for (i,j) in zip(a,x) if i >= 4] [(4, ''d''), (5, ''e''), (6, ''f''), (7, ''g''), (8, ''h''), (9, ''j'')]

usando Itertools

>>> [ _ for _ in itertools.compress(d, map(lambda x: x>=4,a)) ] # a will be the list compare to 4 # d another list with same length

Use itertools.compress con una sola línea en Python para terminar de cerrar esta tarea

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> d = [''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''j''] # another list with same length >>> map(lambda x: x>=4, a) # this will return a boolean list [False, False, False, True, True, True, True, True, True] >>> import itertools >>> itertools.compress(d, map(lambda x: x>4, a)) # magic here ! <itertools.compress object at 0xa1a764c> # compress will match pair from list a and the boolean list, if item in boolean list is true, then item in list a will be remain ,else will be dropped #below single line is enough to solve your problem >>> [ _ for _ in itertools.compress(d, map(lambda x: x>=4,a)) ] # iterate the result. [''d'', ''e'', ''f'', ''g'', ''h'', ''j'']

Explicación para itertools.compress, creo que esto quedará claro para su comprensión:

>>> [ _ for _ in itertools.compress([1,2,3,4,5],[False,True,True,False,True]) ] [2, 3, 5]


el uso de la función de filtro incorporado está bien

>>>a = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>>filter(lambda x : x < 4, a) [1, 2, 3]

Explicación

filtro (FUN, iterable)

esta expresión iterará todo el elemento de Iterable y suministrará a FUN función como argumento, si return es True, entonces la regla se agregará a una lista interna

lambda x: x> 4

esto significa una función anónima que tomará un argumento y lo probará si es mayor que 4, y devolverá el valor Verdadero de Falso

Tu solución

Si intenta eliminar todos los elementos mayores de 4, intente soplar

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> filter(lambda x: x<4 ,a) [1, 2, 3]


>>> import numpy as np >>> a = np.array(range(1,10)) >>> indices = [i for i,v in enumerate(a >= 4) if v] >>> indices [3, 4, 5, 6, 7, 8] >>> mask = a >= 4 >>> mask array([False, False, False, True, True, True, True, True, True], dtype=boo l) >>> a[mask] array([4, 5, 6, 7, 8, 9]) >>> np.setdiff1d(a,a[mask]) array([1, 2, 3])


>>> [i for i,v in enumerate(a) if v > 4] [4, 5, 6, 7, 8]

enumerate devuelve el índice y el valor de cada elemento en una matriz. Entonces, si el valor v es mayor que 4 , incluya el índice i en la nueva matriz.

O simplemente puede modificar su lista en su lugar y excluir todos los valores superiores a 4 .

>>> a[:] = [x for x in a if x<=4] >>> a [1, 2, 3, 4]