RegularGridInterpolator 및 interp2d 인수 순서
19341 단어 파이썬interpolation비망록numpy
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")
Reference
이 문제에 관하여(RegularGridInterpolator 및 interp2d 인수 순서), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tobimogura/items/13fb586aa447ee96f6d1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)