web-dev-qa-db-ja.com

Python)の2D最近隣内挿

次のルックアップテーブルがあるとします。

        | 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

このテーブルには、ラベリングマトリックス(01sのみ)、x値、およびy値が含まれています。このルックアップテーブルに対して最近隣内挿をどのように持つことができますか?

例:

Input: (5.1, 4.9)
Output: 1

Input: (3.54, 6.9)
Output: 0
10
A.M.

ルックアップテーブル

補間を必要としない完全なテーブルがある場合は、最も近い(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
10
Vrekrer