微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在python中高效重新网格化大型二维数组

如何解决在python中高效重新网格化大型二维数组

我正在尝试找到将二维数组的一部分重新划分为更细网格的最有效方法。为了保持程序的通用性,我更喜欢使用numpy或scipy之类的标准软件包的解决方案,但这也许超出了他们的能力范围。

预期的输入数据是Geotiff DEM(数字高程模型)文件,使用GDAL导入,并转换为numpy数组。问题是许多输入文件没有CRS信息。

在下面的MWE中,重新网格化到2x2网格(用于演示),这在我的本地计算机上花费96s。实际的细网格将大得多,并且细网格将在循环中创建多次。我承认这种MWE可能是执行此操作效率最低的方法

import numpy as np
import scipy.interpolate as interp
import time

nx,ny = 1600,2400 # size of input data
z_in = np.random.normal(size=(nx,ny)) # make input data
x_in,y_in = np.mgrid[0:nx,0:ny]*0.0932248 # make x,y coordinate arrays for input data

# make new (finer) x,y coordinate arrays. none of these x,y coordinates 
# necessarily overlap directly with those of the input dataset.
nx_new,ny_new = 2,2 # size of fine array (in reality,this will be much larger (up to 1000x1000))
x_new,y_new = np.mgrid[0:nx_new,0:ny_new] 
x_new = x_new*0.01 + 60
y_new = y_new*0.01 + 85

# regrid the data
starttime=time.time()
flattened_xy_in = np.array([x_in.flatten(),y_in.flatten()]).transpose()
fine_DEM_z = interp.griddata(flattened_xy_in,z_in.flatten(),(x_new,y_new),method='cubic')
print('that took '+str(time.time()-starttime)+' seconds...')

解决方法

您的输入是位于规则矩形网格上的数据,因此您在使用griddata浪费资源,该资源可用于插入非结构化数据。相反,如果您已经在网格上有数据,则使用RectBivariateSpline可以大大加快插值速度。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。