RegularGridInterpolator 및 interp2d 인수 순서

다사다사의 비망록입니다.

scipy.interpolate.RegularGridInterpolator 의 인수나 그리드의 지정의 순서로 언제나 혼란하므로 테스트 코드를 써 보았다.
왜 혼란하는가 하면, scipy.interpolate.interp2d라든지, 확실히 견인수의 순서가 다르게 보이기 때문이다.

아니, interp2d의 그리드용의 인수는 1차원 배열 2개로, RegularGridInterpolator의 제1 인수는 복수차원 배열이지요? 물건이 다르다고 하면 그대로이고, 또한 다차원 배열의 경우 x(l개), y(m개), z(n개)라면 shape는(n, m, l)쨩, 라고 말하면 돌려줄 말도 없지만, 마침내 반대로 써 버리는 것이다. <옛부터 행렬 약

그래서 이렇게 부끄러워 하면 다음은 틀리지 않을까-라고 기도하면서 비망록.
import numpy as np
from scipy.interpolate import RegularGridInterpolator

x_iter = np.array([0,1,2,3,4])
y_iter = np.array([5,6,7])
z_iter = np.array([8,9])
print("number of x_iter l = %d" % (len(x_iter)))
print("number of y_iter m = %d" % (len(y_iter)))
print("number of z_iter n = %d" % (len(z_iter)))

def data_func(x, y, z) :
    return x + y*10 + z*100

data = []
for z in z_iter :
    buf2 = []
    for y in y_iter :
        buf = []
        for x in x_iter :
            buf.append(data_func(x, y, z))
        buf2.append(buf)
    data.append(buf2)

data = np.array(data)
print("data", data)
print("shape of data, n x m x l array", data.shape)

data_grid = tuple([z_iter, y_iter, x_iter])
print("data grid with a format tuple(z_iter, y_iter, x_iter) is", data_grid)
f = RegularGridInterpolator(data_grid, data)

point_of_interest = tuple([8.3, 5.5, 1.1])
print("point_of_interest with a format tuple(z, y, x) is", point_of_interest)
interp_value = f(point_of_interest)

print("interpolated value is", interp_value)

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib import colors

figid = 1
plt.figure(figid)
ax1 = plt.subplot(1, 1, 1)
xx, yy = np.meshgrid(x_iter, y_iter)

data_2D = data[0, :, :]
print("shape of data_2D for z_bin = 0", data_2D.shape)
phist = ax1.pcolormesh(xx, yy, data_2D, norm=colors.Normalize())
plt.colorbar(phist)
ax1.set_ylabel("y")
ax1.set_xlabel("x")
plt.savefig("interp_test.png")


for로 돌면서 데이터를 작성할 때, 돌리는 순서에 주의.
Default에서는 x, y, z의 값에 범위외의 값을 지정하면 에러한다. 이 동작은 bounds_error 인수와 fill_value 변수로 제어 가능 (기본적으로 bounds_error=True, fill_value=nan 으로 되어 있다)



덧붙여서, scipy.interpolation.interp2D를 사용하는 경우는 이런 느낌.
Default에서는 x와 y의 값에 범위외의 값을 지정해도 죽지 않는다(data table내의 최단의 값을 돌려준다). 이 동작은 bounds_error 인수와 fill_value 변수로 제어 가능 (기본적으로 bounds_error=False, fill_value=None 으로 되어 있다)
import numpy as np
from scipy.interpolate import interp2d

x_iter = np.array([0,1,2,3,4])
y_iter = np.array([5,6,7])
print("number of x_iter l = %d" % (len(x_iter)))
print("number of y_iter m = %d" % (len(y_iter)))

def data_func(x, y) :
    return x + y*10

data = []
for y in y_iter :
    buf = []
    for x in x_iter :
        buf.append(data_func(x, y))
    data.append(buf)

data = np.array(data)
print("data", data)
print("shape of data, m x l array", data.shape)

# order of arguments: x-axis, y-axis, data
f = interp2d(x_iter, y_iter, data)

x = 1.5
y = 5.5
print("datapoint is (%f, %f), data_func(%f, %f) is %f" % (x, y, x, y, data_func(x, y)))
interp_value = f(x, y)
print("interpolated value is", interp_value)

# test2 : what happens if x1 is out of range?
x1 = 7 # x-range is (0, 4)
y1 = 10 # y-range is (5, 7)
print("datapoint is (%f, %f), data_func(%f, %f) is %f" % (x1, y1, x1, y1, data_func(x1, y1)))
interp_value = f(x1, y1)
print("interpolated value is", interp_value)
# this value is 
print("interpolated value for (%f, %f) is %f" % (x_iter[-1], y_iter[-1], f(x_iter[-1], y_iter[-1])))

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib import colors

figid = 1
plt.figure(figid)
ax1 = plt.subplot(1, 1, 1)
xx, yy = np.meshgrid(x_iter, y_iter)

phist = ax1.pcolormesh(xx, yy, data, norm=colors.Normalize())
plt.colorbar(phist)
ax1.set_ylabel("y")
ax1.set_xlabel("x")
plt.savefig("interp_test2D.png")

좋은 웹페이지 즐겨찾기