「平滑」 是不明確定義的操作;這意味着什麼是開放的解釋。有許多操作導致「更平滑」的數據,並且其中大多數操作至少有一個控制平滑量的參數。如果不瞭解更多關於你將如何處理平滑數據的信息,很難對這個問題給出明確的答案。
無論如何,這是一個答案。 :)
scipy.interpolate.Rbf
是包含平滑參數的n維數據的插值器。當此參數爲0(默認值)時,會創建一個真正的插補器,即它會返回給定(x,y)值處的給定z值,而在其他點處,將返回插值的z值。 Rbf
包括一個smooth
參數,文檔字符串表示「大於零的值會增加近似的平滑度」。
所以,回答你的問題,使用Rbf
是:
f = Rbf(x, y, z, smooth=<a positive number>)
z_smoothed = f(x, y)
(不幸的是,Rbf
文檔字符串沒有解釋如何smooth
使用你不得不深入到代碼,找出在此期間,您可以嘗試一些值並查看結果是否符合您的需求。)
以下腳本是使用Rbf
與非零值smooth
參數的示例。使用matplotlib繪製輸入點和平滑表面。
import numpy as np
from scipy.interpolate import Rbf
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Generate some random (x, y, z) values.
npoints = 36
np.random.seed(12345)
x, y = np.random.rand(2, npoints)
z = np.cos(3*x)*np.sin(2*y) + 0.4*np.random.randn(npoints)
# "Interpolator" with smoothing
f = Rbf(x, y, z, smooth=0.05)
print("Original z values:")
print(z)
print("Smoothed z values:")
print(f(x, y))
u = np.linspace(0, 1, 25)
xx, yy = np.meshgrid(u, u)
zz = f(xx, yy)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
surf1 = ax.plot_surface(xx, yy, zz, rstride=1, cstride=1, color='g',
linewidth=0, antialiased=False, alpha=0.5)
plt.show()
該腳本生成以下圖表。藍點是原始數據,綠色表面是由Rbf
創建的函數的圖形。
腳本打印:
Original z values:
[-0.34127933 -0.30729404 0.21155127 0.82107652 0.17163933 -0.44447561
-0.62316986 -0.07631452 -0.2452825 0.08006371 -0.16038592 -1.15094797
0.97879369 -0.59069121 0.28481385 -0.61505364 -1.28958296 -0.40040525
-0.62065409 0.10887611 0.11082111 -0.57756184 -0.08303365 0.1736536
-0.11741524 -0.25279036 -0.87523777 -0.62589892 0.14774674 1.02822874
1.40065013 0.0570847 -1.24442082 1.29216089 0.04075983 0.35829967]
Smoothed z values:
[-0.4760952 -0.32638375 0.33082556 0.81805681 0.04136433 -0.04617472
-0.6941891 -0.17280308 -0.21626414 -0.25286811 -0.19661876 -1.04547018
1.19599927 -0.55479106 0.3257578 -0.35879233 -0.9914419 -0.74646378
-0.60559207 -0.11546096 -0.10684431 -0.35038102 0.05290993 0.10818459
-0.07302746 -0.33240211 -0.82955756 -0.32360917 0.11565045 0.98144511
1.22421926 -0.08092414 -0.97381114 1.16754806 0.01186976 0.11594726]
感謝您抽出時間來幫助,我真的很感激! – Mark