Encuentra el valor más cercano en una matriz numpy

Resuelto Fookatchu asked hace 14 años • 20 respuestas

¿ Cómo encuentro el valor más cercano en una matriz numerosa? Ejemplo:

np.find_nearest(array, value)
Fookatchu avatar Apr 02 '10 18:04 Fookatchu
Aceptado
import numpy as np
def find_nearest(array, value):
    array = np.asarray(array)
    idx = (np.abs(array - value)).argmin()
    return array[idx]

Uso de ejemplo:

array = np.random.random(10)
print(array)
# [ 0.21069679  0.61290182  0.63425412  0.84635244  0.91599191  0.00213826
#   0.17104965  0.56874386  0.57319379  0.28719469]

print(find_nearest(array, value=0.5))
# 0.568743859261
unutbu avatar Apr 02 '2010 12:04 unutbu

SI su matriz está ordenada y es muy grande, esta es una solución mucho más rápida:

def find_nearest(array,value):
    idx = np.searchsorted(array, value, side="left")
    if idx > 0 and (idx == len(array) or math.fabs(value - array[idx-1]) < math.fabs(value - array[idx])):
        return array[idx-1]
    else:
        return array[idx]

Esto se escala a matrices muy grandes. Puede modificar fácilmente lo anterior para ordenar en el método si no puede asumir que la matriz ya está ordenada. Es excesivo para matrices pequeñas, pero una vez que crecen, es mucho más rápido.

Demitri avatar Sep 24 '2014 20:09 Demitri

Con una ligera modificación, la respuesta anterior funciona con matrices de dimensión arbitraria (1d, 2d, 3d,...):

def find_nearest(a, a0):
    "Element in nd array `a` closest to the scalar value `a0`"
    idx = np.abs(a - a0).argmin()
    return a.flat[idx]

O, escrito en una sola línea:

a.flat[np.abs(a - a0).argmin()]
kwgoodman avatar May 05 '2012 21:05 kwgoodman