2016-06-10 4 views
0

Я хотел бы сгладить набор тупочек xyz на поверхность и вернуть значение surface(z') в исходном наборе координат (x,y).Ядро плавное множество xyz tuplets (приветствуется python python приветствуется)

Существует ли более прямой подход, затем интерполяция исходных данных на сетку, сглаживание и переоценка. Если это лучший подход, существует ли определенная функция 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') 

ответ

0

"Сглаживание" не является четко определенной операции; это означает, что он открыт для интерпретации. Существует много операций, которые приводят к «более плавным» данным, и большинство из них имеют по крайней мере один параметр, который контролирует количество сглаживания. Не зная больше о том, что вы собираетесь делать с сглаженными данными, трудно дать окончательный ответ на этот вопрос.

Вот так или иначе. :)

scipy.interpolate.Rbf - это интерполятор для n-мерных данных, который включает в себя параметр сглаживания. Когда этот параметр равен 0 (по умолчанию), создается истинный интерполятор, т. Е. Он возвращает заданные значения z при заданных (x, y) значениях, а в других точках возвращает значения интерполированных значений 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.

plot

Скрипт печатает:

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] 
+0

Благодарим Вас за время, чтобы помочь, я действительно ценю это! – Mark

 Смежные вопросы

  • Нет связанных вопросов^_^