更新:在每个像元上应用(矢量化)函数以内插网格

马廷

我有一个问题。我已经使用了这些SO线程thisthisthat到达了现在的位置。

我有一个DEM文件,可以协调气象站的数据。现在,我想使用我的DEM插值遵循GIDS模型(本文中的模型12)的气温数据对于电台的选择,我想使用KDTree的8个最近的邻居。

简而言之,(我认为)我想使用我的DEM的坐标和高程来评估每个单元格的功能。

我已经开发了一个工作函数,该函数使用x,y作为输入来评估网格的每个值。请参阅我的IPython Notebook的详细信息

但是现在是整个numpy数组。我以某种方式理解我必须对函数进行向量化,以便可以将其应用于Numpy数组,而不是使用双循环。请参阅我的简化代码,以使用for循环和使用numpy meshgrid进行矢量化函数的试验来评估我在数组上的函数。这是前进的方向吗?

>>> 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大小为100,100的网格检查实际数据,结果如下:

#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

两者都不太好..

马廷

如果对网格使用矢量化函数,请尝试使用相关数组的形状构建网格。使用从网格网格派生的组件使用矢量化函数评估每个网格单元。像这样

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在网格上模拟 numpy 矢量化函数

来自分类Dev

使用矢量化操作在DF的多个像元上创建条件变量

来自分类Dev

MATLAB:在两个矩阵上应用函数的有效(矢量化)方法?

来自分类Dev

在矢量化函数中调用矢量化函数

来自分类Dev

更新矢量化函数中的tqdm进度条

来自分类Dev

用lubridate :: month()编写矢量化函数以产生会计年度

来自分类Dev

对熊猫DataFrame进行矢量化更新?

来自分类Dev

隐藏矢量化函数的输出

来自分类Dev

使用函数接收矢量化输出

来自分类Dev

Python Pandas。将函数应用于矢量化形式

来自分类Dev

Python Pandas - 矢量化自定义函数而不是应用

来自分类Dev

连续二维切片上的numpy矢量化函数

来自分类Dev

numpy矢量化

来自分类Dev

熊猫矢量化

来自分类Dev

矢量化算法

来自分类Dev

矢量化列表

来自分类Dev

从熊猫应用过渡到矢量化方法

来自分类Dev

以矢量化方式更新 oracle 中的列

来自分类Dev

查找提供给未知矢量化函数的参数

来自分类Dev

Python中的矢量化球形贝塞尔函数?

来自分类Dev

互补误差函数erfcf()的矢量化实现

来自分类Dev

通过矢量化提高np.irr函数的性能

来自分类Dev

MATLAB中函数数组的矢量化或单行评估

来自分类Dev

我怎么知道R中的函数或操作是矢量化的?

来自分类Dev

用矢量化函数替换慢熊猫循环

来自分类Dev

使用numpy以矢量化形式打开for循环函数

来自分类Dev

多列熊猫矢量化字符串函数?

来自分类Dev

如何矢量化这个特定的非 numpy 函数?

来自分类Dev

如何在 Pandas DataFrame 上对循环进行矢量化