Python 如何从几个numpy数组中找到两个最近的numpy数组?

Python 如何从几个numpy数组中找到两个最近的numpy数组?,python,numpy,Python,Numpy,我有几个numpy数组,我想比较它们,找到给定数组中最接近的数组。我可以使用以下公式计算这些阵列之间的距离。但是,有没有办法从几个numpy数组中找到最接近的两个数组 对于我得到的数组print(arr.shape)给出(300,)要找到最接近的两个,需要计算距离矩阵,然后在该矩阵中找到最小值以获得彼此最接近的坐标(使用该矩阵,可以得到坐标的索引) 从scipy.spatial导入距离 将numpy作为np导入 coords=np.array([ (35.0456, -85.2672), (35

我有几个numpy数组,我想比较它们,找到给定数组中最接近的数组。我可以使用以下公式计算这些阵列之间的距离。但是,有没有办法从几个numpy数组中找到最接近的两个数组


对于我得到的数组
print(arr.shape)
给出
(300,)
要找到最接近的两个,需要计算距离矩阵,然后在该矩阵中找到最小值以获得彼此最接近的坐标(使用该矩阵,可以得到坐标的索引)

从scipy.spatial导入距离
将numpy作为np导入
coords=np.array([
(35.0456, -85.2672),
(35.1174, -89.9711),
(35.9728, -83.9422),
(36.1667, -86.7833)
])
距离=距离.cdist(坐标,坐标,'欧几里德')
#如果你不这样做,那么与自我的距离将永远存在
#是矩阵中的最小距离(始终为0):
np.fill\u对角线(距离,np.inf)
最小索引=(np.argmin(距离))
最近的=np.展开索引(最小索引,距离.形状)
一旦定义了
最近的
索引,就可以获得关于最近坐标对的所有信息:

print(f“两个最近的是{最近的}”)
打印(f“他们在距离{距离[最近]}”)
打印(f“分别坐标{coords[0]]}和{coords[1]]}”)
产出:

The two closest are (0, 2)
They are at distance 1.6171965990565296
Resp. coordinates [ 35.0456 -85.2672] and [ 35.9728-83.9422]
最后,请注意,所有这些输入也会起作用:

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])

编写一个距离函数,然后使用itertools计算列表对之间的距离如何

例如:

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])))
结果:

 [([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]

我使用的numpy数组是fasttext向量表示。我尝试了你发布的内容,每次距离我都得到0.0。为什么?距离函数假定向量中的元素是整数。您应该能够进行转换。例如,使用列表理解
a_1=[int(x)表示a_1中的x]
可以很好地工作。这是我的错。据我所知,我认为你在上面发布的内容是找到给定数组中最近的两个点。但我需要的是在许多数组中找到两个最接近的数组(类似于@Horbaje的答案),它的作用是在一个坐标数组中找到最接近的坐标(用数组表示,或者元组表示,但这是相同的)。因此,它会在数组列表中找到最近的数组。我编辑了我的答案,并添加了数组数组而不是元组数组的详细信息。