簡體   English   中英

python 3D樣條插值

[英]Spline interpolation in 3D in python

我正在搜索等效的Matlab命令

Vq = interp3(X,Y,Z,V,Xq,Yq,Zq)

在Python中。 在Matlab中,我可以使用“樣條”插值方法,而在python中找不到3D數據。 存在scipy.interpolate.griddata,但沒有用於3D數據的樣條線。

我要插入的數據是3D矩陣(51x51x51),該矩陣定期分布在3D網格上。

可能是scipy.interpolate.Rbf,但我無法正常工作:

xi = yi = zi = np.linspace(1, 132651, 132651) interp = scipy.interpolate.Rbf(xi, yi, zi, data, function='cubic')

導致內存錯誤。

編輯:我想要(沒有插值)的最小示例:Matlab代碼

v=rand([51,51,51]);
isosurface (v, 0.3);

為簡單起見,在此示例中,我使用隨機數據。 我要繪制等值面圖(特別是費米曲面圖)。 由於某些結構非常小,因此需要51x51x51的高網格分辨率。

進一步說明:矩陣中的數據集彼此獨立,z(或第3個分量)不是x和y的函數。

可以使用您描述的scipy.interpolate.Rbf完成3維以上的樣條插值。 出於繪圖目的,您可以使用較小的分辨率(1000點是一個很好的經驗法則),並且當您要評估樣條線時,可以插值大於132000點而沒有問題(請參見下面的示例)。

您可以為在matlab中嘗試執行的操作添加最小,完整和可驗證的示例嗎? 這將解釋為什么您需要創建分辨率為132000點的網格空間。 另外,請注意,存在維數的詛咒。 Matlab使用三次樣條或分段多項式 ,由於過度擬合可能會造成危險。 我建議您使用一種更明智的方法來訓練51個數據點並將其應用於132000+個數據點。 是多項式曲線擬合和模型選擇的一個很好的例子。

例:

產生資料:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

%matplotlib inline
import random
# set seed to reproducible
random.seed(1)
data_size = 51
max_value_range = 132651
x = np.array([random.random()*max_value_range for p in range(0,data_size)])
y = np.array([random.random()*max_value_range for p in range(0,data_size)])
z = 2*x*x*x + np.sqrt(y)*y + random.random()
fig = plt.figure(figsize=(10,6))
ax = axes3d.Axes3D(fig)
ax.scatter3D(x,y,z, c='r')

在此處輸入圖片說明

擬合樣條曲線和插值

x_grid = np.linspace(0, 132651, 1000*len(x))
y_grid = np.linspace(0, 132651, 1000*len(y))
B1, B2 = np.meshgrid(x_grid, y_grid, indexing='xy')
Z = np.zeros((x.size, z.size))

import scipy as sp
import scipy.interpolate
spline = sp.interpolate.Rbf(x,y,z,function='thin_plate',smooth=5, episilon=5)

Z = spline(B1,B2)
fig = plt.figure(figsize=(10,6))
ax = axes3d.Axes3D(fig)
ax.plot_wireframe(B1, B2, Z)
ax.plot_surface(B1, B2, Z,alpha=0.2)
ax.scatter3D(x,y,z, c='r')

在此處輸入圖片說明

使樣條曲線適合大數據

predict_data_size = 132000
x_predict = np.array([random.random()*max_value_range for p in range(0,predict_data_size)])
y_predict = np.array([random.random()*max_value_range for p in range(0,predict_data_size)])
z_predict = spline(x_predict, y_predict)
fig = plt.figure(figsize=(10,6))
ax = axes3d.Axes3D(fig)
ax.plot_wireframe(B1, B2, Z)
ax.plot_surface(B1, B2, Z,alpha=0.2)
ax.scatter3D(x_predict,y_predict,z_predict, c='r')

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM