将3D数据(不规则垂直网格)插值到常规垂直网格。优化循环

时间:2012-03-08 09:51:35

标签: python optimization loops interpolation

我正在使用3D字段。水平网格是不规则的,并且垂直网格也是不规则的,并且在水平网格中不同于一个节点(由于sigma垂直坐标)。

我想在常规垂直坐标上插入这些数据,现在我发现的唯一方法是在每个水平点上循环,然后进行简单的1D垂直插值。这很容易实现(参见下面的一个简单示例)但完全没有效率(在我的原始情况下插入一个时间步长10分钟,我有超过10 000个时间步骤进行后续处理)     #!在/ usr / bin中/蟒蛇     导入numpy为np     来自scipy import interpolate

## Horizontal mesh
x = range(0,300); y = range(0,200)
[X,Y] = np.meshgrid(x,y)

## Input 
z1   = np.array([0.,5.,10.,20.,50.,100.,200.,500.,1000.])
Z_in = np.zeros((z1.shape[0],X.shape[0],X.shape[1]))
for i in range(0,X.shape[0]):
  for j in range(0,X.shape[1]):
     Z_in[:,i,j]  = z1[:]
Z_in = Z_in+np.random.randint(-2,2,size=(z1.shape[0],X.shape[0],X.shape[1]))
var_in = np.random.randint(-10,10,size=(z1.shape[0],X.shape[0],X.shape[1]))

## Output
zout = np.array([0.,2.5,5.,7.5,10.,15.,20.,35.,50.,75.,100.,150.,200.,500.,1000.])
var_out = np.zeros((zout.shape[0],X.shape[0],X.shape[1]))

##Interpolation
for i in range(0,X.shape[0]):
   for j in range(0,X.shape[1]):
      var_out[:,i,j] = interpolate.interp1d(Z_in[:,i,j],var_in[:,i,j],bounds_error=False,fill_value=np.nan)(zout)

如果我的初始垂直网格在每个点都是常规的,那么根据之前的帖子(http://stackoverflow.com/questions/7755871/interpolating-a-3d-array-in-python-how-避免循环)但在我的情况下,我找不到一个简单的解决方案。我试图使用带有函数的映射:

def interp_perso(Z_in,var_in,zout): return interpolate.interp1d(Z_in[:],var_in[:],bounds_error=False,fill_value=np.nan)(zout)

Zout =  np.zeros((X.shape[0],X.shape[1]))
for l in range(0,zout.shape[0]):
   Zout[:,:] = zout[l]
   var_out[l] = map(interp_perso,Z_in,var_in,Zout)

但是我仍然遇到了interp1d错误:“ValueError:x数组必须只有一个维度。”你知道其他任何实现方法吗?我做错了吗?我很乐意提出其他一些建议。

提前谢谢。

0 个答案:

没有答案