Tengo una matriz NumPy, y quiero recuperar todos los elementos excepto un cierto índice. Por ejemplo, considere la siguiente matriz
a = [0,1,2,3,4,5,5,6,7,8,9]
Si especifico el índice 3, entonces el resultado debe ser
a = [0,1,2,4,5,5,6,7,8,9]
Al igual que cambiar el tamaño, eliminar elementos de una matriz numpy es una operación lenta (especialmente para matrices grandes, ya que requiere la asignación de espacio y la copia de todos los datos de la matriz original a la nueva matriz). Debe evitarse si es posible.
A menudo, puedes evitarlo trabajando con una matriz enmascarada . Por ejemplo, considere la matriz a
:
import numpy as np a = np.array([0,1,2,3,4,5,5,6,7,8,9]) print(a) print(a.sum()) # [0 1 2 3 4 5 5 6 7 8 9] # 50
Podemos enmascarar su valor en el índice 3 y realizar una sum que ignora los elementos enmascarados :
a = np.ma.array(a, mask=False) a.mask[3] = True print(a) print(a.sum()) # [0 1 2 -- 4 5 5 6 7 8 9] # 47
Las matrices enmascaradas también admiten muchas operaciones además de la sum
.
Si realmente lo necesita, también es posible eliminar elementos enmascarados utilizando el método compressed
:
print(a.compressed()) # [0 1 2 4 5 5 6 7 8 9]
pero como se mencionó anteriormente, evitarlo si es posible.
a_new = np.delete(a, 3, 0)
3
aquí está el índice que desea eliminar, 0
es el eje (cero en este caso si usa una matriz 1D). Ver np.delete
Aquí hay una sola línea si a es una matriz numpy:
>>> a[np.arange(len(a))!=3] array([0, 1, 2, 4, 5, 5, 6, 7, 8, 9])
Esto debería hacerlo:
In [9]: np.hstack((a[:3], a[4:])) Out[9]: array([0, 1, 2, 4, 5, 5, 6, 7, 8, 9])
Si el rendimiento es un problema, lo siguiente lo hará en su lugar:
In [22]: a[3:-1] = a[4:]; a = a[:-1]
Otra solución es usar la función concatenar de numpy.
>>> x = np.arange(0,10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> i = 3 >>> np.concatenate((x[:i],x[(i+1):])) array([0, 1, 2, 4, 5, 6, 7, 8, 9])