Python 更新:在每个单元格上应用(矢量化)函数以插值网格
我有个问题。我用了这么多的线,来达到我现在的目的 我有一个DEM文件和来自气象站的坐标+数据。现在,我想使用我的DEM按照GIDS模型()插值气温数据。对于站点的选择,我想使用KDTree中的8个最近邻 简而言之,(我想)我想用我的DEM的坐标和高程来计算每个单元的函数 我开发了一个工作函数,它使用x,y作为输入来评估网格的每个值。请参阅我的详细信息 但现在是整个numpy阵列。我不知怎的明白,我必须对我的函数进行矢量化,以便我可以将它应用于Numpy数组,而不是使用双循环。请参阅我的简化代码,使用for循环和使用numpy网格的矢量化函数的试用来评估数组上的函数。这是前进的方向吗Python 更新:在每个单元格上应用(矢量化)函数以插值网格,python,numpy,scipy,interpolation,Python,Numpy,Scipy,Interpolation,我有个问题。我用了这么多的线,来达到我现在的目的 我有一个DEM文件和来自气象站的坐标+数据。现在,我想使用我的DEM按照GIDS模型()插值气温数据。对于站点的选择,我想使用KDTree中的8个最近邻 简而言之,(我想)我想用我的DEM的坐标和高程来计算每个单元的函数 我开发了一个工作函数,它使用x,y作为输入来评估网格的每个值。请参阅我的详细信息 但现在是整个numpy阵列。我不知怎的明白,我必须对我的函数进行矢量化,以便我可以将它应用于Numpy数组,而不是使用双循环。请参阅我的简化代码,
>>> data = [[0.8,0.7,5,25],[2.1,0.71,6,35],[0.75,2.2,8,20],[2.2,2.1,4,18]]
>>> columns = ['Long', 'Lat', 'H', 'T']
>>> df = pd.DataFrame(data, columns=columns)
>>> tree = KDTree(zip(df.ix[:,0],df.ix[:,1]), leafsize=10)
>>> dem = np.array([[5,7,6],[7,9,7],[8,7,4]])
>>> print 'Ground points\n', df
Ground points
Long Lat H T
0 0.80 0.70 5 25
1 2.10 0.71 6 35
2 0.75 2.20 8 20
3 2.20 2.10 4 18
>>> print 'Grid to evaluate\n', dem
Grid to evaluate
[[5 7 6]
[7 9 7]
[8 7 4]]
>>> def f(x,y):
... [see IPython Notebook for details]
... return m( sum((p((d(1,di[:,0])),2)))**-1 ,
... sum(m(tp+(m(b1,(s(pix.ix[0,0],longp))) + m(b2,(s(pix.ix[0,1],latp))) + m(b3,(s(pix.ix[0,2],hp)))), (p((d(1,di[:,0])),2)))) )
...
>>> #Double for-loop
...
>>> tp = np.zeros([dem.shape[0],dem.shape[1]])
>>> for x in range(dem.shape[0]):
... for y in range(dem.shape[1]):
... tp[x][y] = f(x,y)
...
>>> print 'T predicted\n', tp
T predicted
[[ 24.0015287 18.54595636 19.60427132]
[ 28.90354881 20.72871172 17.35098489]
[ 54.69499782 43.79200925 15.33702417]]
>>> # Evaluation of vectorized function using meshgrid
...
>>> x = np.arange(0,3,1)
>>> y = np.arange(0,3,1)
>>> xx, yy = np.meshgrid(x,y, sparse=True)
>>> f_vec = np.vectorize(f) # vectorization of function f
>>> tp_vec = f_vec(xx,yy).T
>>> print 'meshgrid\nx\n', xx,'\ny\n',yy
meshgrid
x
[[0 1 2]]
y
[[0]
[1]
[2]]
>>> print 'T predicted using vectorized function\n', tp_vec
T predicted using vectorized function
[[ 24.0015287 18.54595636 19.60427132]
[ 28.90354881 20.72871172 17.35098489]
[ 54.69499782 43.79200925 15.33702417]]
编辑
我使用%%timeit
检查实际数据,网格大小为100100,结果如下:
#double loop
for x in range(100):
for y in range(100):
tp[x][y] = f(x,y)
1 loops, best of 3: 29.6 s per loop
#vectorized
tp_vec = f_vec(xx,yy).T
1 loops, best of 3: 29.5 s per loop
两者都不太好。如果对网格使用矢量化函数,请尝试使用相关数组的形状构建网格网格。使用从meshgrid派生的组件,使用矢量化函数计算每个网格单元。像这样的
def f(x,y):
'...some code...'
single_value = array[x,y] # = dependent array (e.g. DEM)
'...some code...'
return z
x = np.arange(array.shape[0])
y = np.arange(array.shape[1])
xx, yy = np.meshgrid(x,y, sparse=True)
f_vec = np.vectorize(f) # vectorization of function f
tp_vec = f_vec(xx,yy).T
虽然我很感激你在介绍背景和参考资料等方面相当谨慎,但你的问题对你来说既非常具体,回答起来也相当耗时(这会最大限度地减少你提供帮助的动机)。我建议你用嵌入的测试数据写一个简单的例子来说明你的困难。我已经更新了一个简化的通用版本的代码。现在让它成为一个-创建一个包含所有运行和演示问题的文件,然后发布。去掉所有不相关的东西。当你这样做的时候,试着更紧密地坚持;目前,您的代码很难解析(最重要的是,您的函数
f
很难阅读-多行并使用更清晰的变量名)。@Henry,感谢您的输入,非常感谢。我是认真的。我的问题是如何在每个细胞上应用矢量化函数。所以我添加了答案。现在我正在努力优化我的功能,但这与这个问题无关。不管怎样,再次谢谢。哦,我一直以为这就是困难所在!根据我的经验,人们很少发现np。矢量化做了他们想做的事情。