Ricerca in Numpy
Ho ordinato il numero crescente se esegui abs (arr) nel codice sottostante, sto cercando di cercare l'indice in cui il segno è stato cambiato da negativo a positivo. Ho scritto questo codice sotto, ma per alcuni motivi, credo che possiamo migliorarlo o ottimizzarlo di più. Eventuali suggerimenti e trucchi?
import numpy as np
arr = np.array([-1,-2,-3, 4, 5, 6])
_cut_index_1 = np.where(arr > 0)[0][0]
_cut_index_2 = np.where(arr < 0)[0][-1]
arr[_cut_index_1] # output: 4
arr[_cut_index_2] # output: -3
Risposte
La tua soluzione attuale esegue due passaggi sull'array di input (le due invocazioni di np.where) che, come affermato, sembra uno spreco. Un modo semplice per risolvere il problema è utilizzare il np.argmaxche richiederà tempo lineare:
import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3
A questo punto, se possiamo supporre (come tu sembri sottintendere) che ci sia un'unica posizione di interesse (e / o che ci interessi solo della prima, leggi da sinistra a destra) abbiamo finito: basta decrementarne una da la risposta e hai l'altro punto di interruzione (ma controlla se siamo in un caso d'angolo in modo da non restituire un indice non valido).
Ma in effetti, se puoi tranquillamente presumere che l'input sia ordinato, puoi evitare di fare una scansione lineare e nemmeno leggere l'intero input. Per questo, puoi fare una ricerca binaria tramite searchsorted . Teoricamente, questo è più veloce (cioè logaritmico vs. lineare nel caso peggiore) ma in pratica dipenderà dalla dimensione della matrice. Cioè, per array abbastanza piccoli una scansione lineare sarà più veloce a causa della località della cache (o, almeno, questo dovrebbe essere il caso dei dettagli hardware).