[PYTHON] Ordre des arguments pour RegularGridInterpolator et interp2d

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)

interp_test.png

À 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

Ordre des arguments pour RegularGridInterpolator et interp2d
00. Ordre inverse des chaînes
Résumé des arguments Python
Dictionnaire des arguments de mots clés
Ordre de référence des variables de classe et des variables d'instance dans "self. Variables de classe" en Python
Le problème des menteurs et de l'honnêteté
Mécanisme de pyenv et virtualenv
Pré-traitement et post-traitement de pytest
Combinaison de récursif et de générateur
Combinaison de anyenv et direnv
Explication et mise en œuvre de SocialFoceModel
Différenciation du tri et généralisation du tri
Coexistence de pyenv et autojump
Arguments optionnels et * args, ** kwargs
Utilisation et intégration de "Shodan"
Le problème des menteurs et de l'honnêteté
Occurrence et résolution de tensorflow.python.framework.errors_impl.FailedPreconditionError
Comparaison d'Apex et de Lamvery
Installation source et installation de Python
Introduction et astuces de mlflow.