Wyszukiwanie w Numpy
Posortowałem rosnącą liczbę, jeśli wykonujesz abs (arr) w poniższym kodzie, próbuję wyszukać indeks, w którym znak został zmieniony z ujemnego na dodatni. Napisałem ten kod poniżej, ale z pewnych powodów uważam, że możemy go ulepszyć lub zoptymalizować. Jakieś wskazówki i triki?
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
Odpowiedzi
Twoje obecne rozwiązanie wykonuje dwa przejścia przez tablicę wejściową (dwa wywołania np.where), co, jak stwierdzono, wydaje się marnotrawstwem. Jednym prostym sposobem rozwiązania problemu jest użycie np.argmaxliniowego czasu:
import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3
W tym momencie, jeśli możemy założyć (jak zdaje się sugerować), że istnieje jedna pozycja będąca przedmiotem zainteresowania (i / lub że zależy nam tylko na pierwszej, czytanej od lewej do prawej), jesteśmy skończeni: po prostu zmniejsz jedną pozycję z odpowiedź i masz drugi punkt odcięcia (ale sprawdź, czy jesteśmy na rogu sprawy, aby nie zwrócić nieważnego indeksu).
Ale w rzeczywistości, jeśli możesz bezpiecznie założyć, że dane wejściowe są posortowane, możesz uniknąć skanowania liniowego, a nawet nie odczytać całego wejścia. W tym celu możesz przeprowadzić wyszukiwanie binarne za pomocą wyszukiwania posortowanego . Teoretycznie jest to szybsze (tj. Logarytmiczne vs. liniowe w najgorszym przypadku), ale w praktyce będzie to zależało od rozmiaru tablicy. Oznacza to, że w przypadku wystarczająco małych tablic skanowanie liniowe będzie szybsze ze względu na lokalizację pamięci podręcznej (lub przynajmniej tak powinno być w przypadku danych dotyczących sprzętu).