我有一种算法,可以在满足某些条件时使用地理坐标来计算形状。该算法将输出纬度列表和经度列表,如下所示。因此lat [0]和lon [0]将代表一个坐标对。我想创建一个纬度和经度图形状的布尔数组,如果算法输出中存在相应的坐标点,则索引为true。我具有netcdf文件中的原始纬度和经度信息,但是如何制作一个可以与算法输出进行比较的二维坐标点数组,然后使用匹配的索引来创建此布尔数组?
我尝试将纬度和经度合并为一个数组。 len(lat) = 81, len(lon) = 480
,我需要一个(81,480)
数组。我认为我必须使用numpy where函数来确定坐标对匹配的位置。
lat_alg = [-47.25 -47.25 -47.25 -48. -48. -48. -48. -48. -48. -48.
-48. -48.75 -48.75 -48.75 -48.75 -48.75 -48.75 -49.5 -49.5 -49.5
-49.5 -50.25 -50.25 -50.25]
lon_alg = [225.75 226.5 227.25 226.5 227.25 228. 228.75 229.5 230.25 231.
231.75 228. 228.75 229.5 230.25 231. 231.75 229.5 230.25 231.
231.75 230.25 231. 231.75]
我创建的布尔数组是...
ar_tracker = np.zeros((len(lat),len(lon)))
并且我希望输出为1,坐标匹配。
答案 0 :(得分:0)
由于具有真实值,因此无法使用==
进行检查。因此,我们必须使用不等式限制的窗口。结果,我们获得了所选窗口中的元素索引(在此示例中为 11和12 )
# 1. build numpy arrays
lat = np.array([-47.25, -47.25, -47.25, -48., -48., -48., -48., -48., -48., -48., -48., -48.75, -48.75, -48.75, -48.75, -48.75, -48.75, -49.5, -49.5, -49.5, -49.5, -50.25, -50.25, -50.25])
lon= np.array([225.75, 226.5, 227.25, 226.5, 227.25, 228., 228.75, 229.5, 230.25, 231., 231.75, 228., 228.75, 229.5, 230.25, 231., 231.75, 229.5, 230.25, 231., 231.75, 230.25, 231., 231.75])
# 2. pick the values in the desired window for each data series, set to zeros the others
La = np.where( (lat> -49.0) & (lat<-48), lat, 0*lat)
Lo = np.where( (lon>226) & (lon<229), lon, 0*lon)
#3. give the indices where both series are non-zero
ind = np.argwhere(np.abs(Lo*La)>0.0001)
ind
array([[11],
[12]], dtype=int64)
或者,如果您更喜欢带有布尔值的数组:
(np.abs(Lo*La)>0.0001).astype(int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0])
答案 1 :(得分:0)
尝试一下:
import numpy as np
lat_alg = np.array([-47.25, -47.25, -47.25, -48., -48., -48., -48., -48., -48.,
-48., -48., -48.75, -48.75, -48.75, -48.75, -48.75, -48.75,
-49.5, -49.5, -49.5, -49.5, -50.25, -50.25, -50.25])
lon_alg = np.array([225.75, 226.5, 227.25, 226.5, 227.25, 228., 228.75, 229.5,
230.25, 231., 231.75, 228., 228.75, 229.5, 230.25, 231.,
231.75, 229.5, 230.25, 231., 231.75, 230.25, 231., 231.75])
desired_position = np.array([-47.5, 228])
tolerance = 1
lat = np.abs(lat_alg - desired_position[0]) <= tolerance
lon = np.abs(lon_alg - desired_position[1]) <= tolerance
desired_area = np.outer(lat, lon).astype(int)
如果要比较精确匹配而不是坐标 windows ,请尝试使用numpy.isclose以避免浮点数差异:
import numpy as np
lat_alg = np.array([-47.25, -47.25, -47.25, -48., -48., -48., -48., -48., -48.,
-48., -48., -48.75, -48.75, -48.75, -48.75, -48.75, -48.75,
-49.5, -49.5, -49.5, -49.5, -50.25, -50.25, -50.25])
lon_alg = np.array([225.75, 226.5, 227.25, 226.5, 227.25, 228., 228.75, 229.5,
230.25, 231., 231.75, 228., 228.75, 229.5, 230.25, 231.,
231.75, 229.5, 230.25, 231., 231.75, 230.25, 231., 231.75])
desired_position = np.array([-47.5, 228])
lat = np.isclose(lat_alg - desired_position[0], 0)
lon = np.isclose(lon_alg - desired_position[1], 0)
exact_matches = np.outer(lat, lon).astype(int)
desired_area
和exact_matches
都是形状为(len(lat), len(lon))
的二维数组。
答案 2 :(得分:0)
为了完全确定该对是否存在,建议您建立一个元组列表,其中每个元组都包含一对(纬度,经度)。例如:
def Mesh(X,Y):
A=[]
for x,y in zip(X,Y):
A.append((x,y))
return A
Coord=Mesh(lat_alg,lon_alg)
然后,如果您知道网格分辨率,则可以按以下步骤轻松检查一对:
coord=(-49.5,230.25)
if coord in Coord:
print('True')
else:
print('False')