xyz 元组的内核平滑集(python 首选伪代码欢迎)

Kernel smooth set of xyz tuplets (python preferred pseudocode welcome)

我想将一组 xyz 元组平滑到一个曲面中,并且 return surface(z') 在原始坐标组 (x,y) 处的值.

有没有更直接的方法,然后将原始数据插值到网格上,对其进行平滑处理并重新评估。如果这是最好的方法,是否有 python 人们喜欢的特定功能/是标准?

例如:

(x1,y1,z1) -> (x1,y1,z1')
(x2,y2,z2) -> (x2,y2,z2')
(x3,y3,z3) -> (x3,y3,z3')
(x4,y4,z4) -> (x4,y4,z4')

"Smoothing" 不是定义明确的操作;它的意思可以解释。产生 "smoother" 数据的操作有很多,其中大多数至少有一个控制平滑量的参数。在不了解您将如何处理平滑数据的情况下,很难对这个问题给出明确的答案。

这里有一个答案。 :)

scipy.interpolate.Rbf 是包含平滑参数的 n 维数据插值器。当此参数为 0(默认值)时,将创建一个真正的插值器,即它 returns 在给定的 (x, y) 值处的给定 z 值,并在其他点 returns 插值z 值。 Rbf 包含一个 smooth 参数,文档字符串说 "Values greater than zero increase the smoothness of the approximation."

因此,使用 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]