Non essendo una persona NumPy, ho preso un colpo 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])
Secondo i miei test, questo sovraperforma numpy.delete()
. Non so perché sarebbe il caso, forse a causa delle piccole dimensioni della matrice iniziale?
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
Questa è una differenza piuttosto significativo (in direzione opposta a quello che mi aspettavo), qualcuno ha qualche idea del perché questo sarebbe il caso?
Ancora più stranamente, passando a numpy.delete()
un elenco si comporta in modo peggiore di un ciclo attraverso l'elenco e dandogli singoli indici.
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
Modifica: sembra avere a che fare con la dimensione dell'array. Con array di grandi dimensioni, numpy.delete()
è notevolmente più veloce.
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
Ovviamente, questo è tutto abbastanza irrilevante, come si dovrebbe sempre andare per la chiarezza ed evitare di reinventare la ruota, ma ho trovato un po 'interessante, quindi ho pensato di lasciarla qui.
Grazie mille. Ho provato che Bur non poteva farlo funzionare per qualche motivo. Funziona ora –
@DanielThaagaardAndreasen Felice di essere stato in grado di aiutare. – Levon
Questa risposta è fuorviante. Il secondo argomento di numpy.delete non è un indice dell'elemento che si desidera rimuovere, ma l'elemento effettivo che si desidera rimuovere. –