Gibt es einen numpy-thonischen Weg, z.B. eine Funktion, um die nächstgelegener Wert in einem Array?
Ejemplo:
np.find_nearest( array, value )
Gibt es einen numpy-thonischen Weg, z.B. eine Funktion, um die nächstgelegener Wert in einem Array?
Ejemplo:
np.find_nearest( array, value )
Ich denke, der pythonischste Weg wäre der:
num = 65 # Input number
array = np.random.random((10))*100 # Given array
nearest_idx = np.where(abs(array-num)==abs(array-num).min())[0] # If you want the index of the element of array (array) nearest to the the given number (num)
nearest_val = array[abs(array-num)==abs(array-num).min()] # If you directly want the element of array (array) nearest to the given number (num)
Dies ist der grundlegende Code. Sie können ihn als Funktion verwenden, wenn Sie wollen
Alle Antworten sind nützlich, um Informationen zu sammeln und effizienten Code zu schreiben. Ich habe jedoch ein kleines Python-Skript geschrieben, um für verschiedene Fälle zu optimieren. Der beste Fall ist, wenn das bereitgestellte Array sortiert ist. Wenn man den Index des nächstgelegenen Punktes eines bestimmten Wertes sucht, dann bisect
Modul ist am zeitsparendsten. Wenn eine Suche den Indizes eines Arrays entspricht, wird die numpy searchsorted
am effizientesten ist.
import numpy as np
import bisect
xarr = np.random.rand(int(1e7))
srt_ind = xarr.argsort()
xar = xarr.copy()[srt_ind]
xlist = xar.tolist()
bisect.bisect_left(xlist, 0.3)
In [63]: %time bisect.bisect_left(xlist, 0.3) CPU-Zeiten: user 0 ns, sys: 0 ns, gesamt: 0 ns Wandzeit: 22,2 µs
np.searchsorted(xar, 0.3, side="left")
In [64]: %time np.searchsorted(xar, 0.3, side="left") CPU-Zeiten: user 0 ns, sys: 0 ns, gesamt: 0 ns Wandzeit: 98.9 µs
randpts = np.random.rand(1000)
np.searchsorted(xar, randpts, side="left")
%time np.searchsorted(xar, randpts, side="left") CPU-Zeiten: user 4 ms, sys: 0 ns, gesamt: 4 ms Wandzeit: 1,2 ms
Wenn wir der multiplikativen Regel folgen, dann sollte numpy ~100 ms benötigen, was ~83X schneller bedeutet.
Dies ist eine vektorisierte Version von unutbu's Antwort :
def find_nearest(array, values):
array = np.asarray(array)
# the last dim must be 1 to broadcast in (array - values) below.
values = np.expand_dims(values, axis=-1)
indices = np.abs(array - values).argmin(axis=-1)
return array[indices]
image = plt.imread('example_3_band_image.jpg')
print(image.shape) # should be (nrows, ncols, 3)
quantiles = np.linspace(0, 255, num=2 ** 2, dtype=np.uint8)
quantiled_image = find_nearest(quantiles, image)
print(quantiled_image.shape) # should be (nrows, ncols, 3)
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.