no ser 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])
Según 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 muy significativa (en el sentido contrario 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 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 hay que ir por la claridad y evitar reinventar la rueda, pero me pareció un poco interesante, así que pensé que me iría aquí.
Muchas gracias. Intenté que la fresa no pudiera hacerlo funcionar por alguna razón. Funciona ahora –
@DanielThaagaardAndreasen Feliz de haber podido ayudar. – Levon
Esta respuesta es engañosa. El segundo argumento para numpy.delete no es un índice del artículo que desea eliminar, sino el elemento real que desea eliminar. –