我可以对非均匀间隔的多维数组的插值进行矢量化处理吗?

时间:2019-03-23 18:14:04

标签: performance multidimensional-array vectorization interpolation

我目前有一个例程,该例程采用5D矩阵(x,y,z,t,p)并将数据插值到不同半径的x-y空间中的一系列圆上。对于每个p--p代表模型解-对单个p的完全内插(内插x,y,z和t)大约需要17分钟。到我达到p = 5时,CPUtime已超过,内核已转储。 5D矩阵的大小为1701,2201,40,48,6。我不能简单地导入此数据,所以我有一个采用前4个维并应用插值运算的函数。我不能使用scipy.griddata,因为x-y间距(纬度)不均匀并且会在整个空间中变化。我要插入的圆具有以下半径(千米)(20、30、40、50、75、100,125,150,175,200,250,300,400,500,600,700)。从圆心到圆弧边缘的经度和纬度已通过单独的计算确定。每个圆包含约72个点,归因于从0到360的5度间隔。如果计算成功,矩阵的最终大小将是6,48,17,72。前两个索引是t和p或时间和模型结果,而17和72表示以半径表示的圆数和圆周围的点。如果我执行一个模型解决方案,我的例程将起作用,并且我已经确认结果是现实的。我需要找到一种加快计算速度的方法,以避免超出CPU时间并使该程序可用于将来使用。我研究了几个与插值有关的问题,并确定不能使用scipy.griddata;但是几乎没有信息与我的问题类型重叠。现在,我正在遍历np.interp1d。必须有一个更好的解决方案,也许涉及矢量化

我有一个函数来获取数据文件(称为文件),将其导入,并使用输入的缩小域,即矩阵的子集(例如lon-> lon [minrow:maxrow,mincol:maxcol] ),以减少遍历插值过程时的计算时间。 A

在导入数据后,我通过一系列循环进行插值(网格是不均匀的,似乎唯一起作用的是逐维插值)。如下面的代码所示,我循环遍历每个时间点(N),圆(M)和角位置(P)。在Geointerp内部,根据矩形的高度,lon和lat进一步将插值细分为一系列循环。在Geointerp内,我使用一个例程来确定最接近兴趣点的位置,并创建一个正方形子集(本质上是3X3),并在lat和lon的循环表达式中而不是在整个lat-lon空间中使用它。代码粘贴在下面...

  1. 主要功能:仅显示代码的相关部分。...
N,M,P=Lonrange.shape #Lonrange is the lons of the circle (N=time,M=num of circles, P=num of angles)
n,m,p,q=var.shape #m=time index,n=height index,p=lon index, q=lat index
varinterp=np.zeros((N,M,P,m))
for j in range(N):
     for k in range(M):
          for l in range(P):
                  varinterp[j][k][l][:]=Geointerp(Lonrange[j][k][l],Latrange[j][k][l],Lon,Lat,var[j,:,:,:])
  1. 内部Geointerp 注意:记得Lon,Lat,Lonrange,Latrange和var是输入
m,n=Lon.shape
lon=np.reshape(Lon,(m*n,1)) #changing the matrix to an array (speeds up calculation
lat=np.reshape(Lat,(m*n),1))
row,col=Minimum_Difference_2(Lon,Lat,lon,lat,Lonrange,Latrange)  #Finds row and col that is closest to the Lonrange and Latrange point!
LATs=Lat[row-1:row+2,col-1:col+2]
LONs=Lon[row-1:row+2,col-1:col+2]  #essentially creates a 3X3 subset
rr,cc=LONs.shape
M=var.shape
VAR=var[:,row-1:row+2,col-1:col+2] #
#Going through first dimesion, x
varinterp1=np.zeros((M[0],rr)) #var is a 3D matrix within Geointerp (z,x,y).  M[0]=the z index
lattest=np.zeros(rr)
for i in range(M[0]):
    for j in range(rr):
         if row==0 or col=0:
              varinterp1[i][j]=np.float('nan')
              lattest[j]=np.float('nan')
         else:
              varinterp1[i][j]=np.interp(Lonrange,LONs,VAR[i,j,:])
              lattest[j]=np.interp(Lonrange,LONs[j,:],LATs[j,:])
##Now next dimension (y)       
varinterp2=np.zeros((M[0]))
for i in range(M[0]):
        if row==0 or col==0: #If the row and col are 0, then outside interp range
               varinterp2[i]=np.float('nan')
        else:
               varinterp2[i]=np.interp(Latrange,lattest,varinterp1[i,:])

return varinterp2

这是包含相关信息的两段代码。 VARINTERP2应该是最终结果,并且当将两个嵌套功能组合在一起时,期望的矩阵必须达到6,48,17,72以上。 是否可以对此处的任何插值过程进行矢量化处理,以避免过多的循环?

0 个答案:

没有答案