Qualcuno può fornirmi un modo migliore (più semplice, più leggibile, più Pythonic, più efficiente, ecc) per rimuovere più valori da una matrice di quello che segue:Come rimuovere più valori da un array in una volta
import numpy as np
# The array.
x = np.linspace(0, 360, 37)
# The values to be removed.
a = 0
b = 180
c = 360
new_array = np.delete(x, np.where(np.logical_or(np.logical_or(x == a,
x == b),
x == c)))
Una buona risposta a questa domanda produrrebbe lo stesso risultato del codice precedente (ovvero, new_array
), ma potrebbe fare un lavoro migliore occupandosi dell'uguaglianza tra float rispetto al codice precedente.
BONUS
Qualcuno può spiegarmi perché questo produce il risultato che non va?
In [5]: np.delete(x, x == a)
/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py:3254: FutureWarning: in the future insert will treat boolean arrays and array-likes as boolean index instead of casting it to integer
"of casting it to integer", FutureWarning)
Out[5]:
array([ 20., 30., 40., 50., 60., 70., 80., 90., 100.,
110., 120., 130., 140., 150., 160., 170., 180., 190.,
200., 210., 220., 230., 240., 250., 260., 270., 280.,
290., 300., 310., 320., 330., 340., 350., 360.])
I valori 0 e 10 sono entrambi stati rimossi, piuttosto che 0 (a
).
nota, x == a
è come previsto (quindi il problema è all'interno np.delete
):
In [6]: x == a
Out[6]:
array([ True, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False], dtype=bool)
Nota anche che np.delete(x, np.where(x == a))
produce il risultato corretto. Pertanto, mi sembra che np.delete
non possa gestire indici booleani.
Se si dispone di indici booleani, non è necessario utilizzare 'delete'. Specifica che 'obj: slice, int o array of ints' (non booleano). – hpaulj