Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从lat/lon坐标获取网格尺寸的有效方法_Python_Arrays_Numpy_Geospatial_Netcdf - Fatal编程技术网

Python:从lat/lon坐标获取网格尺寸的有效方法

Python:从lat/lon坐标获取网格尺寸的有效方法,python,arrays,numpy,geospatial,netcdf,Python,Arrays,Numpy,Geospatial,Netcdf,我需要一种非常有效的方法来提取一组纬度/经度numpy数组的网格维度(即2d数组的x/y索引)。在过去,我通过计算所有网格单元和lat/lon坐标之间的大圆距离(使用harversine公式),然后找到最小值索引(基本上是寻找最近的点)。这里有一个链接,指向包含此问题的numpy网格数组的zip文件。这些数组最初来自具有曲线网格的netCDF文件 这工作很好,但我需要为这3亿点,所以这个方法将是太慢(将需要超过一年)。这是我目前的方法和我尝试过的其他方法 将numpy导入为np 输入数学 导入

我需要一种非常有效的方法来提取一组纬度/经度numpy数组的网格维度(即2d数组的x/y索引)。在过去,我通过计算所有网格单元和lat/lon坐标之间的大圆距离(使用harversine公式),然后找到最小值索引(基本上是寻找最近的点)。这里有一个链接,指向包含此问题的numpy网格数组的zip文件。这些数组最初来自具有曲线网格的netCDF文件

这工作很好,但我需要为这3亿点,所以这个方法将是太慢(将需要超过一年)。这是我目前的方法和我尝试过的其他方法

将numpy导入为np
输入数学
导入时间
从scipy.spatial导入cKDTree
#加载numpy lat/lon栅格
lat_array=np.load(“../data/lat_array.npy”)
lon_array=np.load(“../data/lon_array.npy”)
#获取阵列形状尺寸,以便以后进行转换
grid\u shape=lat\u array.shape
#lat/lon坐标测试
纬度=-32
lon=154
N=3e8#我需要做多少个lat/lon对
哈维辛法
#Harversine方法
def haversine(lon1、lat1、lon2、lat2):
"""
计算两点之间的大圆距离
地球上(以十进制度数表示)
"""
#将十进制度数转换为弧度
lon1,lat1,lon2,lat2=贴图(数学弧度,[lon1,lat1,lon2,lat2])
#哈维辛公式
dlon=lon2-lon1
dlat=lat2-lat1
a=数学sin(dlat/2.)**2+数学cos(lat1)*数学cos(lat2)*数学sin(dlon/2.)**2。
c=2。*数学asin(数学sqrt(a))
公里=6371。*c#地球半径
返回公里
#试验法
打印(“\nServerSine结果”)
tic=时间。性能计数器()
#为所有网格单元创建与该点的距离列表
dist_array=np.asarray([haversine(lon,lat,grid_lon,grid_lat)用于grid_lon,grid_lat在zip中(lon_array.flatte(),lat_array.flatte()))
#获取最小值的索引
min\u idx=np.argmin(dist\u数组)
#将索引转换回网格单元维度
网格dims=np。展开索引(最小idx,网格形状)
toc=时间。性能计数器()
#报告结果
打印('以秒为单位的单次迭代时间:',圆形(toc-tic,2))
打印(‘N次迭代时间,以天为单位:’,四舍五入((toc-tic)*N)/60/60/24,2))
打印('栅格坐标:',栅格尺寸)
如果(lon_array.flatten()[min_idx]==lon_array[grid_dims[0],grid_dims[1]])和(lat_array.flatten()[min_idx]==lat_array[grid_dims[0],grid_dims[1]]:
打印('结果通过检查!:)')
其他:
打印('结果未通过检查:('))
输出

Single iteration time in seconds: 0.13
N iterations time in days: 443.94
Grid coordinate: (179, 136)
Results pass checks! :)
Tunnel distance results
Single iteration time in seconds: 0.00667
N iterations time in days: 23.15
Grid coordinate: (179, 136)
Results pass checks! :)
Alt Numba Harversine results
Single iteration time in seconds: 1.26
N iterations time in days: 4364.29
Grid coordinate: (179, 136)
Results pass checks! :)
KD Tree method results
Single iteration time in seconds: 0.13
N iterations time in days: 438.42
Grid coordinate: (179, 136)
Results pass checks! :)
KD Tree alternative method results
Single iteration time in seconds: 0.00018
N iterations time in days: 0.63
Grid coordinate: (179, 136)
Results pass checks! :)
隧道距离 输出

Single iteration time in seconds: 0.13
N iterations time in days: 443.94
Grid coordinate: (179, 136)
Results pass checks! :)
Tunnel distance results
Single iteration time in seconds: 0.00667
N iterations time in days: 23.15
Grid coordinate: (179, 136)
Results pass checks! :)
Alt Numba Harversine results
Single iteration time in seconds: 1.26
N iterations time in days: 4364.29
Grid coordinate: (179, 136)
Results pass checks! :)
KD Tree method results
Single iteration time in seconds: 0.13
N iterations time in days: 438.42
Grid coordinate: (179, 136)
Results pass checks! :)
KD Tree alternative method results
Single iteration time in seconds: 0.00018
N iterations time in days: 0.63
Grid coordinate: (179, 136)
Results pass checks! :)
另一种Harversine方法
#alt harversine方法
def haversine_numba(s_lat、s_lng、e_lat、e_lng):
"""
https://towardsdatascience.com/better-parallelization-with-numba-3a41ca69452e
"""
#地球的近似半径(单位:km)
R=6371.0
s_lat=np.deg2rad(s_lat)
s_lng=np.deg2rad(s_lng)
e_lat=np.deg2rad(e_lat)
液化天然气当量=np.deg2rad(液化天然气当量)
d=np.sin((e_lat-s_lat)/2)**2+\
np.cos(s_lat)*np.cos(e_lat)*\
np.sin((欧洲液化天然气-欧洲液化天然气)/2)**2
返回2*R*np.arcin(np.sqrt(d))
#测试harversine-numba方法
打印(“\n打印Numba Harversine结果”)
tic=时间。性能计数器()
#为所有网格单元创建与该点的距离列表
dist_array=np.asarray([haversine_numba(lon,lat,grid_lon,grid_lat)用于grid_lon,grid_lat在zip中(lon_array.flatte(),lat_array.flatte()))
#获取最小值的索引
min\u idx=np.argmin(dist\u数组)
#将索引转换回网格单元维度
网格dims=np。展开索引(最小idx,网格形状)
toc=时间。性能计数器()
#报告结果
打印('以秒为单位的单次迭代时间:',圆形(toc-tic,2))
打印(‘N次迭代时间,以天为单位:’,四舍五入((toc-tic)*N)/60/60/24,2))
打印('栅格坐标:',栅格尺寸)
如果(lon_array.flatten()[min_idx]==lon_array[grid_dims[0],grid_dims[1]])和(lat_array.flatten()[min_idx]==lat_array[grid_dims[0],grid_dims[1]]:
打印('结果通过检查!:)')
其他:
打印('结果未通过检查:('))
输出

Single iteration time in seconds: 0.13
N iterations time in days: 443.94
Grid coordinate: (179, 136)
Results pass checks! :)
Tunnel distance results
Single iteration time in seconds: 0.00667
N iterations time in days: 23.15
Grid coordinate: (179, 136)
Results pass checks! :)
Alt Numba Harversine results
Single iteration time in seconds: 1.26
N iterations time in days: 4364.29
Grid coordinate: (179, 136)
Results pass checks! :)
KD Tree method results
Single iteration time in seconds: 0.13
N iterations time in days: 438.42
Grid coordinate: (179, 136)
Results pass checks! :)
KD Tree alternative method results
Single iteration time in seconds: 0.00018
N iterations time in days: 0.63
Grid coordinate: (179, 136)
Results pass checks! :)
Kdtree方法
#kdtree方法
def kdtree_fast(latvar、lonvar、lat0、lon0):
"""
改编自:
https://github.com/Unidata/python-workshop/blob/fall-2016/notebooks/netcdf-by-coordinates.ipynb
"""
rad_factor=math.pi/180.0#对于三角测量,需要以弧度为单位的角度
#将纬度和经度从文件读入numpy数组
latvals=latvar[:]*rad_因子
lonvals=lonvar[:]*rad_因子
ny,nx=latvals.shape
clat,clon=np.cos(latvals),np.cos(lonvals)
板条,slon=np.sin(latvals),np.sin(lonvals)
#从三维坐标的大数组构建kd树
三元组=列表(zip(np.ravel(clat*clon)、np.ravel(clat*slon)、np.ravel(slat)))
kdt=cKDTree(三元组)
lat0_rad=lat0*rad_因子
lon0_rad=lon0*rad_因子
clat0,clon0=np.cos(纬度),np.cos(纬度)
slat0,slon0=np.sin(纬度),np.sin(纬度)
dist_sq_min,minindex_1d=kdt.query([clat0*clon0,clat0*slon0,slat0])
iy_min,ix_min=np.Unlavel_索引(minindex_1d,latvals.shape)
返回(iy_min,ix_min)
#测试树方法
打印(“\nKD树方法结果”)
tic=时间。性能计数器()
#为所有网格单元创建与该点的距离列表
grid_dims=kdtree_fast(lat_数组、lon_数组、lat、lon)
#获取最小值的索引
min_idx=np.ar