尽管numpy& scipy的许多舍入函数,我找不到允许我对2D统一网格中的节点离散化随机浮点数的函数。例如,
# create mesh grid
n = 11
l = 16.
x = np.linspace(-l/2, l/2, n)
y = np.linspace(-l/2, l/2, n)
xx, yy = np.meshgrid(x, y, sparse=True)
>>> xx
array([-8. , -6.4, -4.8, -3.2, -1.6, 0. , 1.6, 3.2, 4.8, 6.4, 8. ])
>>> yy
array([[-8. ],
[-6.4],
[-4.8],
[-3.2],
[-1.6],
[ 0. ],
[ 1.6],
[ 3.2],
[ 4.8],
[ 6.4],
[ 8. ]])
如果我有m
个正态分布的随机浮点数a=np.random.multivariate_normal([0,0], [[l/2,0],[0,l/2]], m)
,我怎样才能将它们舍入到最近的网格节点(假设是周期性边界)?
答案 0 :(得分:3)
在另一个SO问题中,我帮助提问者使用了一个scipy最近的neigbhor插值器。
从那开始,我找到了解决问题的方法。在scipy.interpolate
我找到NearestNDInterpolator
。由此我发现scipy.spatial
有一种找到最近邻居的方法:
In [936]: from scipy import interpolate
In [937]: interpolate.NearestNDInterpolator?
...
Docstring:
NearestNDInterpolator(points, values)
Nearest-neighbour interpolation in N dimensions.
...
Uses ``scipy.spatial.cKDTree``
In [938]: from scipy import spatial
In [939]: spatial.cKDTree?
cKDTree
分两步使用;从网格中创建一个树,并查询最近的邻居。
从你的meshgrid我可以创建一个(n,2)
点数组
In [940]: xx, yy = np.meshgrid(x, y)
In [941]: xygrid=np.array([xx,yy])
In [942]: xygrid=xygrid.reshape(2,-1).T # clumsy
创建搜索树:
In [943]: tree=spatial.cKDTree(xygrid)
测试点集,(10,2):
In [944]: a=np.random.multivariate_normal([0,0], [[l/2,0],[0,l/2]],10)
搜索树的查询给出了2个数组,一个距离最近邻居的距离,另一个带有索引:
In [945]: I=tree.query(a)
In [946]: I
Out[946]:
(array([ 0.70739099, 0.9894934 , 0.44489157, 0.3930144 , 0.273121 ,
0.3537348 , 0.32661876, 0.55540787, 0.58433421, 0.538722 ]),
array([61, 72, 85, 72, 82, 39, 38, 62, 25, 59]))
将a
点与xygrid
最近邻网格点进行比较,可以看出它们确实看起来很接近。散点图会更好。
In [947]: a
Out[947]:
array([[ 1.44861113, -0.69100176],
[ 1.00827575, 0.80693026],
[ 4.37200745, 3.07854676],
[ 1.2193471 , 1.50220587],
[ 0.12668563, 2.95803754],
[ 1.4758331 , -3.53122635],
[ 0.28425494, -3.03913067],
[ 2.8203361 , 0.40538034],
[-3.67726571, -4.46285921],
[-1.07228578, -0.10834709]])
In [948]: xygrid[I[1],:]
Out[948]:
array([[ 1.6, 0. ],
[ 1.6, 1.6],
[ 4.8, 3.2],
[ 1.6, 1.6],
[ 0. , 3.2],
[ 1.6, -3.2],
[ 0. , -3.2],
[ 3.2, 0. ],
[-3.2, -4.8],
[-1.6, 0. ]])
rth
链接中的解决方案也使用cKDTree
。我只是从您的griddata填写有关如何工作的详细信息。
Finding index of nearest point in numpy arrays of x and y coordinates