C'est un mémorandum de merde.
scipy.interpolate.RegularGrid Je suis toujours confus par l'ordre des arguments d'Interpolator et la spécification de la grille, j'ai donc écrit le code de test. La raison de la confusion est que scipy.interpolate.interp2d et autres semblent avoir un ordre d'arguments différent.
Non, les arguments de la grille interp2d sont deux tableaux unidimensionnels, et le premier argument de RegularGridInterpolator est un tableau multidimensionnel, non? Si vous dites que les choses sont différentes, c'est vrai, et dans le cas d'un tableau multidimensionnel, si x (l), y (m), z (n), la forme est (n, m, l). Je n'ai aucun mot à renvoyer, mais je l'écris simplement à l'envers. <File d'attente faible d'il y a longtemps
Alors, j'ai prié pour que si j'avais honte de cette façon, je ne ferais pas d'erreur la prochaine fois.
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 ")
Lorsque vous créez des données en tournant avec pour, faites attention à l'ordre de rotation. Par défaut, si vous spécifiez une valeur en dehors de la plage des valeurs x, y, z, une erreur se produit. Ce comportement peut être contrôlé avec l'argument bounds_error et la variable fill_value (la valeur par défaut est bounds_error = True, fill_value = nan)
À propos, lorsque vous utilisez scipy.interpolation.interp2D, cela ressemble à ceci. Par défaut, si vous spécifiez une valeur en dehors de la plage pour les valeurs x et y, vous ne mourrez pas (renvoie la valeur finale dans la table de données). Ce comportement peut être contrôlé avec l'argument bounds_error et la variable fill_value (la valeur par défaut est 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 ")
Recommended Posts