una todos remove matriz matrices los lista from filas eliminar elementos elemento delete buscar array agregar python arrays numpy

todos - np.delete python



Cómo eliminar elementos específicos en una matriz numpy (5)

Hay una función numpy incorporada para ayudar con eso.

import numpy as np >>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b = np.array([3,4,7]) >>> c = np.setdiff1d(a,b) >>> c array([1, 2, 5, 6, 8, 9])

¿Cómo puedo eliminar algunos elementos específicos de una matriz numpy? Digamos que tengo

import numpy as np a = np.array([1,2,3,4,5,6,7,8,9])

Entonces quiero eliminar 3,4,7 de a . Todo lo que sé es el índice de los valores ( index=[2,3,6] ).


No siendo una persona numpy, tomé una foto con:

>>> import numpy as np >>> import itertools >>> >>> a = np.array([1,2,3,4,5,6,7,8,9]) >>> index=[2,3,6] >>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))]))) >>> a array([1, 2, 5, 6, 8, 9])

De acuerdo con mis pruebas, esto supera a numpy.delete() . No sé por qué ese sería el caso, tal vez debido al pequeño tamaño de la matriz inicial.

python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))" 100000 loops, best of 3: 12.9 usec per loop python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)" 10000 loops, best of 3: 108 usec per loop

Esa es una diferencia bastante significativa (en la dirección opuesta a lo que esperaba), ¿alguien tiene alguna idea de por qué este sería el caso?

Aún más numpy.delete() , pasar a numpy.delete() una lista funciona peor que al recorrer la lista y darle índices únicos.

python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" " np.delete(a, i)" 10000 loops, best of 3: 33.8 usec per loop

Editar: Parece que tiene que ver con el tamaño de la matriz. Con arreglos grandes, numpy.delete() es significativamente más rápido.

python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))" 10 loops, best of 3: 200 msec per loop python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)" 1000 loops, best of 3: 1.68 msec per loop

Obviamente, todo esto es bastante irrelevante, ya que siempre debes ir por la claridad y evitar reinventar la rueda, pero me pareció un poco interesante, así que pensé que lo dejaría aquí.


Si no conoce el índice, no puede usar logical_and

x = 10*np.random.randn(1,100) low = 5 high = 27 x[0,np.logical_and(x[0,:]>low,x[0,:]<high)]


Una matriz Numpy es immutable , lo que significa que técnicamente no puede eliminar un elemento de ella. Sin embargo, puedes construir una nueva matriz sin los valores que no quieres, como este:

b = np.delete(a, [2,3,6])


Use numpy.delete() - devuelve una nueva matriz con sub-arrays a lo largo de un eje eliminado

numpy.delete(a, index)

Para su pregunta específica:

import numpy as np a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) index = [2, 3, 6] new_a = np.delete(a, index) print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`

Tenga en cuenta que numpy.delete() devuelve una nueva matriz, ya que los escalares de matriz son inmutables, similares a las cadenas en Python, por lo que cada vez que se realiza un cambio en ella, se crea un nuevo objeto. Es decir, para citar los numpy.delete() delete() :

"Una copia de arr con los elementos especificados por obj eliminado. Tenga en cuenta que la eliminación no ocurre in situ ..."

Si el código que publico tiene salida, es el resultado de ejecutar el código.