我正在研究一些python代码,将不规则数据插入到180°纬度x 360°lon球形网格上。当我调用以下代码时,代码当前挂起:
def geo_interp(lats,lons,data,grid_size_deg):
deg2rad = pi/180.
new_lats = np.linspace(grid_size_deg, 180, 180) * deg2rad
new_lons = np.linspace(grid_size_deg, 360, 360) * deg2rad
knotst, knotsp = new_lats.copy(), new_lons.copy()
knotst[0] += .0001
knotst[-1] -= .0001
knotsp[0] += .0001
knotsp[-1] -= .0001
lut = LSQSphereBivariateSpline(lats.ravel(),lons.ravel(),data.T.ravel(),knotst,knotsp)
data_interp = lut(new_lats, new_lons)
return data_interp
当我调用上面的子例程时,我用作参数的数组都符合文档中列出的LSQSphereBivariateSpline的要求。当我运行它时,它需要比处理180x360数据集所需的时间长得多。
当我使用python -m trace --trace运行脚本时,输出的最后一行在很长时间没有发生之前是
fitpack2.py(1025): w=w, eps=eps)
据我所知,fitpack2.py的第1025行在评论中,这更令人困惑。
所以我的问题是: 1.有没有办法判断它是悬挂还是非常慢? 如果它挂了,我该怎么办呢?
我能想到的唯一一件事就是我不知道我在做什么就选择结。有没有一个好方法可以选择那些?我刚刚使用了网格,我将稍后进行插值,因为doc中的示例似乎是一个任意网格。
更新:它在约3小时后终于完成,但“插值数据”看起来像随机噪音。另外,如果这是相关的,据我所知,LSQSphereBivariateSpline是我可以使用的唯一函数,因为我的lats和lons没有严格增加。
另外,我应该在完成后添加输出以下警告:Warning (from warnings module):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/interpolate/fitpack2.py", line 1029
warnings.warn(message)
UserWarning:
WARNING. The coefficients of the spline returned have been computed as the
minimal norm least-squares solution of a (numerically) rank
deficient system (deficiency=16336, rank=48650). Especially if the rank
deficiency, which is computed by 6+(nt-8)*(np-7)+ier, is large,
the results may be inaccurate. They could also seriously depend on
the value of eps.
解决方案:我的结太多了,导致了冰川的速度和无用的结果。