Coeficientes de interpolación de spline de una curva de línea en espacio 3d

Soy nuevo en Python. Tengo una curva de línea en el espacio 3D definido por un conjunto de puntos dados. ¿Alguien puede sugerir cómo puedo usar el interpolar con las funciones spline del paquete scipy para obtener los coeficientes de spline de la curva al igual que la función spline.coeff en MATLAB? ¡Gracias!

EDITAR:

He usado el

tck = interpolate.SmoothBivariateSpline(pts2[:,0], pts2[:,1], pts2[:,2]) test_pts = pts2[:,2]-tck.ev(pts2[:,0], pts2[:,1]) print test_pts 

pero esto es para superficies aparentemente y no para curvas de línea pts2 es una numpy array numpy numpy array contiene las coordenadas de los puntos

ok me di cuenta de lo que estaba haciendo mal. Mis puntos de entrada fueron muy pocos. Ahora tengo otra pregunta. La función get_coeffs se supone que devuelve los coeficientes de spline en cada no. ¿En qué orden se devuelven esos coeficientes? Tengo una matriz de 79 tx y 79 ty que representan los nudos y obtengo una matriz de 1×5625 cuando llamo a la función para llamar a los nudos

    Yo también soy nuevo en Python, pero mi búsqueda reciente me llevó a un tutorial de interpolación scipy muy útil . Al leer esto, estoy de acuerdo en que la familia de clases / funciones BivariateSpline está diseñada para interpolar superficies 3D en lugar de curvas 3D.

    Para mi problema de ajuste de curva 3D (que creo que es muy similar al tuyo, pero con la adición de querer suavizar el ruido) terminé usando scipy.interpolate.splprep (no debe confundirse con scipy.interpolate.splrep). Desde el tutorial vinculado anteriormente, los coeficientes de spline que busca están devueltos por splprep.

    La salida normal es una tupla de 3, (t, c, k), que contiene los puntos de nudo, t, los coeficientes c y el orden k de la spline.

    Los documentos siguen refiriéndose a estas funciones de procedimiento como un “ajuste antiguo, no orientado a objetos de FITPACK” en contraste con las clases “más nuevas, orientadas a objetos” UnivariateSpline y BivariateSpline. Yo hubiera preferido “más nuevo, orientado a objetos” a mí mismo, pero por lo que puedo decir, UnivariateSpline solo maneja el caso 1-D mientras que splprep maneja los datos ND directamente.

    A continuación se muestra un caso de prueba simple que utilicé para averiguar estas funciones:

     import numpy as np import matplotlib.pyplot as plt from scipy import interpolate from mpl_toolkits.mplot3d import Axes3D # 3D example total_rad = 10 z_factor = 3 noise = 0.1 num_true_pts = 200 s_true = np.linspace(0, total_rad, num_true_pts) x_true = np.cos(s_true) y_true = np.sin(s_true) z_true = s_true/z_factor num_sample_pts = 80 s_sample = np.linspace(0, total_rad, num_sample_pts) x_sample = np.cos(s_sample) + noise * np.random.randn(num_sample_pts) y_sample = np.sin(s_sample) + noise * np.random.randn(num_sample_pts) z_sample = s_sample/z_factor + noise * np.random.randn(num_sample_pts) tck, u = interpolate.splprep([x_sample,y_sample,z_sample], s=2) x_knots, y_knots, z_knots = interpolate.splev(tck[0], tck) u_fine = np.linspace(0,1,num_true_pts) x_fine, y_fine, z_fine = interpolate.splev(u_fine, tck) fig2 = plt.figure(2) ax3d = fig2.add_subplot(111, projection='3d') ax3d.plot(x_true, y_true, z_true, 'b') ax3d.plot(x_sample, y_sample, z_sample, 'r*') ax3d.plot(x_knots, y_knots, z_knots, 'go') ax3d.plot(x_fine, y_fine, z_fine, 'g') fig2.show() plt.show() 

    gráfico de salida