2D Nearest Neighbor Interpolation in Python

A.M. picture A.M. · Jul 30, 2015 · Viewed 18.8k times · Source

Suppose that we have the following look up table

        | 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

This table contains a labeling matrix (having only 0 and 1s), x values and y values. How one can have nearest-neighbor interpolation for this look up table?

Example:

Input: (5.1, 4.9)
Output: 1

Input: (3.54, 6.9)
Output: 0

Answer

Vrekrer picture Vrekrer · Jul 31, 2015

Look up table

If you have the complete table you don't need interpolation, you just need to look up the index of the nearest (x, y) value and use it on the table

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

Nearest-neighbor interpolation

scipy.interpolate.NearestNDInterpolator will be really useful if your data is composed by scattered points

For example, for data like:

enter image description here with red = 1, blue =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