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.