J'ai plusieurs tableaux numpy et je souhaite les comparer et trouver le tableau le plus proche pour un tableau donné. Je pourrais calculer la distance entre ces tableaux en utilisant https ://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html. Cependant, existe-t-il un moyen de trouver les deux tableaux les plus proches parmi plusieurs tableaux numpy?

Pour les tableaux que j'ai obtenus, print(arr.shape) donne (300,)

-1
Kabilesh 19 mars 2019 à 12:42

2 réponses

Meilleure réponse

Pour trouver les deux plus proches, vous devrez calculer la matrice de distance, puis trouver le minimum dans cette matrice pour obtenir les coordonnées les plus proches l'une de l'autre (en utilisant la matrice, vous obtiendrez les index des coordonnées).

from scipy.spatial import distance
import numpy as np 

coords = np.array([
  (35.0456, -85.2672),
  (35.1174, -89.9711),
  (35.9728, -83.9422),
  (36.1667, -86.7833)
])

distances = distance.cdist(coords, coords, 'euclidean')

# If you don't do that then the distance to self will always 
# be the min. distance in the matrix (always 0): 
np.fill_diagonal(distances, np.inf)

min_index = (np.argmin(distances))
closest = np.unravel_index(min_index, distances.shape)

Une fois que vous avez défini closest index, vous pouvez avoir toutes les informations que vous souhaitez sur votre paire de coordonnées les plus proches:

print(f"The two closest are {closest}")
print(f"They are at distance {distances[closest]}")
print(f"Resp. coordinates {coords[closest[0]]} and {coords[closest[1]]}")

Les sorties:

The two closest are (0, 2)
They are at distance 1.6171965990565296
Resp. coordinates [ 35.0456 -85.2672] and [ 35.9728-83.9422]

Enfin, notez que toutes ces entrées fonctionneraient également:

coords = np.array([ [35.0456, -85.2672], [35.1174, -89.9711] ])

arr1 = [35.0456, -85.2672]
arr2 = [35.1174, -89.9711]
coords = np.array([arr1, arr2])
1
cglacet 19 mars 2019 à 10:41

Que diriez-vous d'écrire une fonction de distance, puis d'utiliser itertools pour calculer la distance entre des paires de listes?

Par exemple:

a_1 = [0,3,4,5]
a_2 = [4,7,8,9]
a_3 = [12, 34, 44]

from itertools import combinations

def distance(list1, list2):
    """Distance between two vectors."""
    squares = [(p-q) ** 2 for p, q in zip(list1, list2)]
    return sum(squares) ** .5

distances = []
for pair in combinations([a_1, a_2, a_3], 2):
    distances.append(pair)
    distances.append(distance(list(pair[0]), list(pair[1])))

Résultat:

 [([0, 3, 4, 5], [4, 7, 8, 9]), 8.0, ([0, 3, 4, 5], [12, 34, 44]), 52.009614495783374, ([4, 7, 8, 9], [12, 34, 44]), 45.70557952810576]
1
Horbaje 19 mars 2019 à 10:18