Python中的2D最近邻插值

10

假设我们有以下查找表:

        | 1.23    2.63    4.74    6.43    5.64
 -------|--------------------------------------
 -------|--------------------------------------
 2.56   |  0       0      1        0       1
 4.79   |  0       1      1        1       0
 6.21   |  1       0      0        0       0

这张表格包含一个标签矩阵(仅有 01),x 值和 y 值。如何使用最近邻插值来查找此查找表?

示例:

Input: (5.1, 4.9)
Output: 1

Input: (3.54, 6.9)
Output: 0

1
为什么它被标记为scipy和numpy?答案必须使用这些库吗?另外:你尝试了什么? - Filip Malczak
@FilipMalczak,我想了解这些库中是否有特殊的函数。我考虑使用scipy.interpolate.NearestNDInterpolator来实现它。但是,我想知道它对我的问题有多好和有效。 - A.M.
所以你知道如何实现它,但你想知道它是否已经实现了?如果是这样,那么我认为这个问题 - 尽管很有趣 - 超出了SO的范围。请参见:http://stackoverflow.com/help/on-topic和http://stackoverflow.com/help/dont-ask;我认为这个问题太接近第一个链接中的第4点。不过我没有标记它 - 它可能会得到一些有益于某些人的建设性答案。 - Filip Malczak
1
@A.M. 这个答案 可能会给你一些启示。 - Saullo G. P. Castro
@SaulloCastro 谢谢你,Saullo :) - A.M.
1个回答

11

查找表

如果您拥有完整的表,就不需要插值,只需查找最近的(x,y)值的索引并在表中使用它即可。

In [1]: import numpy
   ...: x = numpy.array([1.23, 2.63, 4.74, 6.43, 5.64])
   ...: y = numpy.array([2.56, 4.79, 6.21])
   ...: data = numpy.array([[0, 0, 1, 0, 1],
   ...:                     [0, 1, 1, 1, 0],
   ...:                     [1, 0, 0, 0, 0]])
   ...: 
   ...: def lookupNearest(x0, y0):
   ...:     xi = numpy.abs(x-x0).argmin()
   ...:     yi = numpy.abs(y-y0).argmin()
   ...:     return data[yi,xi]

In [2]: lookupNearest(5.1, 4.9)
Out[2]: 1

In [3]: lookupNearest(3.54, 6.9)
Out[3]: 0

最近邻插值

scipy.interpolate.NearestNDInterpolator对于由散点组成的数据非常有用。

例如,对于像下面这样的数据:

enter image description here其中红色=1、蓝色=0

In [4]: points = numpy.array([[1.1, 2.5], 
   ...:                       [1.5, 5.2], 
   ...:                       [3.1, 3.0], 
   ...:                       [2.0, 6.0], 
   ...:                       [2.8, 4.7]])
   ...: values = numpy.array([0, 1, 1, 0, 0])

In [5]: from scipy.interpolate import NearestNDInterpolator
   ...: myInterpolator = NearestNDInterpolator(points, values)

In [6]: myInterpolator(1.7,4.5)
Out[6]: 1

In [7]: myInterpolator(2.5,4.0)
Out[7]: 0

1
答案的第一部分是错误的。请考虑以下几点:A=(0, 0),B=(1, 100),C=(2, 2)。您的代码会声明A的最近邻是B,即使这并不正确。尝试使用类似于min(data, key=lambda point: (point.x-your_point.x)**2 + (point.y-your_point.y)**2)的方法(这只是一个通用的想法,我知道您无法将坐标作为属性)。没有降低评分,因为第二部分与scipy/numpy相关似乎更重要。 - Filip Malczak
1
@FilipMalczak 如果数据是按矩形网格(完整表格)排列的,则我的答案的第一部分将起作用。 - Vrekrer
好的,我已经将其概括为帖子第二部分的示例。 - Filip Malczak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接