Рассмотрим эту функцию y(x):
где мы можем сгенерировать эти разбросанные точки в файле: dataset_1D.dat
:
# x y
0 0
1 1
2 0
3 -9
4 -32
Ниже приведен код интерполяции 1D для этих точек:
Загрузите эти разбросанные точки
Создайте
x_mesh
Выполнение одномерной интерполяции
Код:
import numpy as np
from scipy.interpolate import interp2d, interp1d, interpnd
import matplotlib.pyplot as plt
# Load the data:
x, y = np.loadtxt('./dataset_1D.dat', skiprows = 1).T
# Create the function Y_inter for interpolation:
Y_inter = interp1d(x,y)
# Create the x_mesh:
x_mesh = np.linspace(0, 4, num=10)
print x_mesh
# We calculate the y-interpolated of this x_mesh :
Y_interpolated = Y_inter(x_mesh)
print Y_interpolated
# plot:
plt.plot(x_mesh, Y_interpolated, "k+")
plt.plot(x, y, 'ro')
plt.legend(['Linear 1D interpolation', 'data'], loc='lower left', prop={'size':12})
plt.xlim(-0.1, 4.2)
plt.grid()
plt.ylabel('y')
plt.xlabel('x')
plt.show()
Это строит следующее:
Теперь рассмотрим эту функцию z(x,y):
где мы можем сгенерировать эти разбросанные точки в файле: dataset_2D.dat
:
# x y z
0 0 0
1 1 0
2 2 -4
3 3 -18
4 4 -48
В этом случае нам пришлось бы выполнить 2D-интерполяцию:
import numpy as np
from scipy.interpolate import interp1d, interp2d, interpnd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Load the data:
x, y, z = np.loadtxt('./dataset_2D.dat', skiprows = 1).T
# Create the function Z_inter for interpolation:
Z_inter = interp2d(x, y, z)
# Create the x_mesh and y_mesh :
x_mesh = np.linspace(1.0, 4, num=10)
y_mesh = np.linspace(1.0, 4, num=10)
print x_mesh
print y_mesh
# We calculate the z-interpolated of this x_mesh and y_mesh :
Z_interpolated = Z_inter(x_mesh, y_mesh)
print Z_interpolated
print type(Z_interpolated)
print Z_interpolated.shape
# plot:
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z, c='r', marker='o')
plt.legend(['data'], loc='lower left', prop={'size':12})
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
Это строит следующее:
где разбросанные данные снова показаны красными точками, чтобы соответствовать 2D-графику.
Я не знаю, как интерпретировать результат
Z_interpolated
:Согласно строкам печати для приведенного выше кода,
Z_interpolated
представляет собой n-мерный массив numpy формы (10,10). Другими словами, двумерная матрица с 10 строками и 10 столбцами.
Я ожидал интерполированное значение z[i]
для каждого значения x_mesh[i]
и y_mesh[i]
Почему я не получаю это?
- Как я мог также отображать интерполированные данные в 3D-графике (точно так же, как черные кресты на 2D-графике)?