python中离散数据插到格点_python–根据每个点的最近邻居距
离,在最佳⽹格上插⼊⾮。。。
在我使⽤的show final solution的答案之后编辑了这个问题
我有来⾃不同来源的⾮结构化2D数据集,例如:
这些数据集是3 numpy.ndarray(X,Y坐标和Z值).
我的最终⽬标是在⽹格上插⼊这些数据以转换为图像/矩阵.
所以,我需要到插⼊这些数据的“最佳⽹格”.⽽且,为此,我需要在该⽹格的像素之间到最佳的X和Y步长.
根据点之间的欧⽒距离确定步骤:
使⽤每个点与其最近邻居之间的欧⼏⾥德距离的平均值.
>使⽤scipy.spacial中的KDTree / cKDTree作为X,Y数据的构建树.
>使⽤k = 2的查询⽅法获取距离(如果k = 1,则距离仅为零,因为每个点的查询都到了⾃⼰).
# Generate KD Tree
xy = np.c_[x, y] # X,Y data converted for use with KDTree
tree = scipy.spacial.cKDTree(xy) # Create KDtree for X,Y coordinates.
# Calculate step
distances, points = tree.query(xy, k=2) # Query distances for X,Y points
distances = distances[:, 1:] # Remove k=1 zero distances
step = an(distances) # Result
性能调整:
>使⽤scipy.spatial.cKDTree⽽不是scipy.spatial.KDTree因为它真的更快.
>使⽤balanced_tree = False与scipy.spatial.cKDTree:在我的情况下⼤⼤加快,但可能不适⽤于所有数据.
>使⽤n_jobs = -1和cKDTree.query进⾏多线程处理.
>使⽤p = 1和cKDTree.query来使⽤曼哈顿距离代替欧⼏⾥德距离(p = 2):更快但可能不太准确.
>仅查询点的随机⼦样本的距离:使⽤⼤型数据集⼤幅加速,但可能不太准确且重复性较差.
在⽹格上插⼊点:
使⽤计算的步骤在⽹格上插⼊数据集点.
# Generate grid
def interval(axe):
'''Return numpy.linspace Interval for specified axe'''
cent = axe.min() + axe.ptp() / 2 # Interval center
nbs = np.ceil(axe.ptp() / step) # Number of step in interval
hwid = nbs * step / 2 # Half interval width
return np.linspace(cent - hwid, cent + hwid, nbs) # linspace
xg, yg = np.meshgrid(interval(x), interval(y)) # Generate grid
# Interpolate X,Y,Z datas on grid
zg = iddata((x, y), z, (xg, yg))
如果像素距离⾸字母点太远,则设置NaN:
将NaN设置为距离初始X,Y,Z数据的点太远(距离>步长)的⽹格像素.使⽤先前⽣成的KDTree. # Calculate pixel to X,Y,Z data distances
dist, _ = tree.query(np.c_[xg.ravel(), yg.ravel()])
linspace numpydist = shape(xg.shape)
# Set NaN value for too far pixels
zg[dist > step] = np.nan
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论