¿Cómo puedo eliminar algunos elementos específicos de una matriz numpy? Di 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]
).
Use numpy.delete () : devuelve una nueva matriz con submatrices 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 la matriz son inmutables, similares a las cadenas en Python, por lo que cada vez que se realiza un cambio, se crea un nuevo objeto. Es decir, para citar los delete()
documentos :
"Una copia de arr con los elementos especificados por obj eliminados. Tenga en cuenta que la eliminación no ocurre en el lugar ..."
Si el código que publico tiene salida, es el resultado de ejecutar el código.
Hay una función incorporada numpy para ayudar con eso.
fuente
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
Una matriz de Numpy es inmutable , lo que significa que técnicamente no puede eliminar un elemento de ella. Sin embargo, puede construir una nueva matriz sin los valores que no desea, como este:
fuente
a[0]=1
modificaa
en su lugar. Pero no pueden ser redimensionados.Para eliminar por valor:
fuente
No siendo una persona numpy, tomé una foto con:
Según mis pruebas, esto supera
numpy.delete()
. No sé por qué ese sería el caso, ¿tal vez debido al pequeño tamaño de la matriz inicial?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 extraño, pasar
numpy.delete()
una lista funciona peor que recorrer la lista y darle índices únicos.Editar: parece tener que ver con el tamaño de la matriz. Con matrices grandes,
numpy.delete()
es significativamente más rápido.Obviamente, todo esto es bastante irrelevante, ya que siempre debes buscar claridad y evitar reinventar la rueda, pero lo encontré un poco interesante, así que pensé en dejarlo aquí.
fuente
a = delte_stuff(a)
en tu primera iteración, que se hacea
más pequeña con cada iteración. Cuando usa la función inbuild, no almacena el valor de nuevo en a, lo que mantiene a en el tamaño original. Además de eso, puede acelerar su función drásticamente, cuando crea un conjuntoindex
y comprueba si se elimina o no un elemento. Arreglando ambas cosas, obtengo 10k artículos: 6.22 ms por bucle con su función, 4.48 ms pornumpy.delete
, que es aproximadamente lo que esperaría.np.array(list(range(x)))
usarnp.arange(x)
, y para crear el índice, puede usarnp.s_[::2]
.Si no conoce el índice, no puede usar
logical_and
fuente
Usar
np.delete
es la forma más rápida de hacerlo, si conocemos los índices de los elementos que queremos eliminar. Sin embargo, para completar, permítanme agregar otra forma de "eliminar" elementos de matriz usando una máscara booleana creada con la ayuda denp.isin
. Este método nos permite eliminar los elementos al especificarlos directamente o mediante sus índices:Eliminar por índices :
Eliminar por elementos (no olvide volver a crear el original
a
ya que fue reescrito en la línea anterior):fuente
Eliminar índice específico (eliminé 16 y 21 de la matriz)
Salida:
fuente
También puedes usar conjuntos:
fuente