Encontrar el punto más cercano de una matriz utilizando la función numpy.linarg.norm ()

Este es el código de Python:

import numpy as np def find_nearest_vector(array, value): idx = np.array([np.linalg.norm(x+y) for (x,y) in array-value]).argmin() return array[idx] A = np.random.random((10,2))*100 """ A = array([[ 34.19762933, 43.14534123], [ 48.79558706, 47.79243283], [ 38.42774411, 84.87155478], [ 63.64371943, 50.7722317 ], [ 73.56362857, 27.87895698], [ 96.67790593, 77.76150486], [ 68.86202147, 21.38735169], [ 5.21796467, 59.17051276], [ 82.92389467, 99.90387851], [ 6.76626539, 30.50661753]])""" pt = [6, 30] print find_nearest_vector(A,pt) #array([ 6.76626539, 30.50661753]) 

¿Alguien me puede explicar el proceso paso a paso para obtener el vector más cercano? Todo el proceso de la función “find_nearest_vector ()”. ¿Alguien me puede mostrar el proceso de rastreo de esta función? Gracias.

De Wikipedia ; La norma L2 (euclidiana) se define como

introduzca la descripción de la imagen aquí

np.linalg.norm simplemente implementa esta fórmula en numpy, pero solo funciona para dos puntos a la vez. Además, parece que su implementación es incorrecta , como señaló @unutbu, en algunos casos solo funciona por casualidad.

Si desea vectorizar esto, recomiendo implementar la norma L2 usted mismo con números vectorizados.

Esto funciona cuando pt es una matriz 1D:

 >>> pt = np.array(pt) >>> A[((A - pt[ None, :]) ** 2).sum(1).argmin()] array([ 6.76626539, 30.50661753]) 

Tenga en cuenta que el punto más cercano tendrá la norma L2 más pequeña, así como la norma L2 cuadrada más pequeña, por lo que es, en cierto sentido, incluso más eficiente que np.linalg.norm que además calcula la raíz cuadrada.