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

时间:2015-09-08 14:30:07

标签: python arrays

我必须在python中的2个数组中找到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]

谢谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以zip latitudelongitude列表,为您提供坐标元组。然后找到那些w.r.t的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))

一些注意事项:

  • 实际上,Euclidian distance也涉及一个平方根,但是为了找到最近的坐标,你不需要计算它;如果x最小,sqrt(x)
  • 也是如此
  • 如评论中所述,使用欧几里德距离并不完全正确,因为地球是一个球体。但是,对于距离不是千里之外的地方,在极点,日期线周围或R'lyeh,它应该是一个足够好的近似值。如果出现这种情况,您可以使用更复杂的Great-circle distance