Сплайн-интерполяция по 3 переменным для разбросанных данных в Python?

Другими словами, я получил набор точек данных (x, y, z), связанных со значением b, и я хотел бы интерполировать эти данные как можно точнее. Scipy.interpolate.griddata может выполнять только линейную интерполяцию, какие есть другие варианты?


person Odile    schedule 26.07.2016    source источник


Ответы (1)


Как насчет интерполяции x, y, z отдельно? Я изменил этот пример и добавил к нему интерполяцию:

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import InterpolatedUnivariateSpline

mpl.rcParams['legend.fontsize'] = 10

# let's take only 20 points for original data:
n = 20

fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, n)
z = np.linspace(-2, 2, n)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='rough curve')

# this variable represents distance along the curve:
t = np.arange(n)

# now let's refine it to 100 points:
t2 = np.linspace(t.min(), t.max(), 100)

# interpolate vector components separately:
x2 = InterpolatedUnivariateSpline(t, x)(t2)
y2 = InterpolatedUnivariateSpline(t, y)(t2)
z2 = InterpolatedUnivariateSpline(t, z)(t2)

ax.plot(x2, y2, z2, label='interpolated curve')

ax.legend()
plt.show()

Результат выглядит следующим образом: 3D-график

ОБНОВЛЕНИЕ

Не понял вопроса с первого раза, извините.

Вероятно, вы ищете трикубическую интерполяцию. Попробуйте это.

person koxy    schedule 27.07.2016
comment
Спасибо за ваш ответ. Использование параметризации в моем случае не вариант, потому что я не знаю, какой будет параметризация... - person Odile; 28.07.2016
comment
Да, я думал, тебе нужно интерполировать линию. Смотрите обновленный ответ. - person koxy; 28.07.2016
comment
Трикубическая интерполяция предназначена для равноотстоящих координат, мои разбросаны. В любом случае, я использовал множество различных методов, и я думаю, что мой единственный вариант — выполнить линейную интерполяцию и, следовательно, использовать scipy.interpolate.griddata(). - person Odile; 29.07.2016