Python将随机浮点数舍入到2D均匀网格网格上的最近点

时间:2015-07-21 14:47:57

标签: python numpy random rounding

尽管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),我怎样才能将它们舍入到最近的网格节点(假设是周期性边界)?

1 个答案:

答案 0 :(得分:3)

在另一个SO问题中,我帮助提问者使用了一个scipy最近的neigbhor插值器。

Repeating Scipy's griddata

从那开始,我找到了解决问题的方法。在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