我必须在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
latitude
和longitude
列表,为您提供坐标元组。然后求出这些点到参考坐标的欧氏距离的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)
或者如果您还需要索引(x
和y
相同),请使用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)
也是最小值 - 如评论所述,使用欧几里得距离并不完全正确,因为地球是一个球体。然而,对于相距不超过几千英里的地点,在两极,在日期变更线附近,或者在里尔,它应该是一个足够好的近似值。如果出现上述情况,可以使用更复杂的大圆距离。