485 Stimmen

Den nächstgelegenen Wert in einem Numpy-Array finden

Gibt es einen numpy-thonischen Weg, z.B. eine Funktion, um die nächstgelegener Wert in einem Array?

Ejemplo:

np.find_nearest( array, value )

6voto

Ishan Tomar Punkte 1390

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

6voto

Soumen Punkte 83

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.

5voto

Zhanwen Chen Punkte 1090

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)

5voto

Gusev Slava Punkte 1918

Vielleicht hilfreich für ndarrays :

def find_nearest(X, value):
    return X[np.unravel_index(np.argmin(np.abs(X - value)), X.shape)]

1voto

Für 2d Array, um die i, j Position des nächsten Elements zu bestimmen:

import numpy as np
def find_nearest(a, a0):
    idx = (np.abs(a - a0)).argmin()
    w = a.shape[1]
    i = idx // w
    j = idx - i * w
    return a[i,j], i, j

CodeJaeger.com

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.

Powered by:

X