在两个匹配x,y坐标的数组中找到两个最接近的值



我必须在python的2个数组中找到2个不同的值。它不会给我这样的问题,但这两个值必须在相同的x,y坐标上,我不知道如何处理。

例如:我必须在第一个数组中找到最接近的数字5,在第二个数组中找到最接近的数字87,但是x和y必须具有相同的值。

目前,我已经完成了每个数组的两个x和y值之间的平均值。但是结果一点也不精确。

你有什么办法来处理这个问题吗?

编辑:这是我的代码:

#This is two arrays that I extract from a file. It contains a lot of values corresponding to latitude and longitude on a earth's photograph.
latitude = data.get_band('latitude').read_as_array(width, height, 0, 0)
longitude = data.get_band('longitude').read_as_array(width, height, 0, 0)
idx = (np.abs(latitude-lat0)).argmin()
nearest_lat = latitude.flat[idx]
idx_lat = np.unravel_index(idx, latitude.shape)
idx = (np.abs(longitude-lon0)).argmin()
nearest_lon =  longitude.flat[idx]
idx_lon = np.unravel_index(idx, longitude.shape)

编辑2:最后,我使用了另一种方法:

            latitude = data.get_band('latitude').read_as_array(width, height, 0, 0)
        longitude = data.get_band('longitude').read_as_array(width, height, 0, 0)
        dist = (latitude - lat0)**2 + (longitude - lon0)**2
        idx = np.argmin(dist)
        idx = np.unravel_index(idx, latitude.shape)
        PIXELCOL = idx[0]
        PIXELROWS = idx[1]

感谢大家的帮助

如果我理解正确,您可以zip latitudelongitude列表,为您提供坐标元组。然后求出这些点到参考坐标的欧氏距离的min

>>> lat0, lon0 = 23, 42
>>> latitude = [random.randint(0, 100) for i in range(50)]
>>> longitude = [random.randint(0, 100) for i in range(50)]
>>> min(zip(latitude, longitude), key=lambda t: (t[0]-lat0)**2 + (t[1]-lon0)**2)
(21, 38)

或者如果您还需要索引(xy相同),请使用enumerate:

>>> min(enumerate(zip(latitude, longitude)), key=lambda t: (t[1][0]-lat0)**2 + (t[1][1]-lon0)**2)
(13, (21, 38))

一些注意事项:

  • 实际上,欧几里得距离也涉及到平方根,但只是为了找到最近的坐标,你不需要计算它;如果x是最小值,那么sqrt(x)
  • 也是最小值
  • 如评论所述,使用欧几里得距离并不完全正确,因为地球是一个球体。然而,对于相距不超过几千英里的地点,在两极,在日期变更线附近,或者在里尔,它应该是一个足够好的近似值。如果出现上述情况,可以使用更复杂的大圆距离。

最新更新