2016-04-11 7 views
0

У меня есть облако точек в 4 измерениях, где каждая точка в облаке имеет местоположение и значение (x, y, z, Value). Кроме того, у меня есть «специальная» точка, S0, внутри облака 3d-точки; Я использовал пример this, чтобы найти ближайшие 10 точек в облаке относительно S0. Теперь у меня есть массив numpy для каждой из 10 ближайших точек и их значений. Как я могу интерполировать эти 10 точек, чтобы найти интерполированное значение в точке S0? Пример кода показан ниже:Интерполяция трехмерных данных в одной точке пространства (Python 2.7)

import numpy as np 
import matplotlib.pyplot as plt 

numpoints = 20 
linexs = 320 
lineys = 40 
linezs = 60 
linexe = 20 
lineye = 20 
lineze = 0 

# Create vectors of points 
xpts = np.linspace(linexs, linexe, numpoints) 
ypts = np.linspace(lineys, lineye, numpoints) 
zpts = np.linspace(linezs, lineze, numpoints) 
lin = np.dstack((xpts,ypts,zpts)) 

# Image line of points 
fig = plt.figure() 
ax = fig.add_subplot(211, projection='3d') 
ax.set_xlim(0,365); ax.set_ylim(-85, 85); ax.set_zlim(0, 100) 
ax.plot_wireframe(xpts, ypts, zpts) 
ax.view_init(elev=12, azim=78) 

def randrange(n, vmin, vmax): 
    return (vmax - vmin)*np.random.rand(n) + vmin 

n = 10 
for n in range(21): 
    xs = randrange(n, 0, 350) 
    ys = randrange(n, -75, 75) 
    zs = randrange(n, 0, 100) 
    ax.scatter(xs, ys, zs) 
dat = np.dstack((xs,ys,zs)) 
ax.set_xlabel('X Label') 
ax.set_xlim(0,350) 
ax.set_ylabel('Y Label') 
ax.set_ylim(-75,75) 
ax.set_zlabel('Z Label') 
ax.set_zlim(0,100) 

ax = fig.add_subplot(212, projection='3d') 
ax.set_xlim(0,365); ax.set_ylim(-85, 85); ax.set_zlim(0, 100) 
ax.plot_wireframe(xpts,ypts,zpts) 
ax.view_init(elev=12, azim=78) 

plt.show() 
dist = [] 

# Calculate distance from first point to all other points in cloud 
for l in range(len(xpts)): 
    aaa = lin[0][0]-dat 
    dist.append(np.sqrt(aaa[0][l][0]**2+aaa[0][l][1]**2+aaa[0][l][2]**2)) 
full = np.dstack((dat,dist)) 
aaa = full[0][full[0][:,3].argsort()] 
print(aaa[0:10]) 
+0

Ваша реализация кажется ОК. если вас интересует количество при интерполяции количества только в одной точке. Однако, если вы хотите сделать это для других точек, это кажется очень неэффективным. Есть способ сделать интерполяцию на основе соседей, но не могли бы вы указать, почему вы хотите сделать это, используя соседние частицы? – Alejandro

+0

Когда вы запускаете скрипт, вы получаете сегмент линии через облако частиц. В конечном счете, давайте представим, что сегмент линии состоит из 5 пунктов. В первой точке сегмента линии я хотел бы найти ближайшие N точек в облаке точек. Затем я хочу интерполировать ближайшие значения N облака точек, чтобы найти значение в первой точке сегмента линии. Затем я повторю это для второго пункта и так далее. – AaronJPung

+0

Редактировать: облако точек основано на наборе данных в 3d-пространстве. Я считаю, что лучший способ найти значение в данной точке пространства - это использовать точки данных, наиболее близкие к интересующей точке (например, первая точка на сегменте линии). – AaronJPung

ответ

2

Основной пример. Обратите внимание, что meshgrid не требуется для интерполяции, но только для быстрого создания ufunc для генерации примерной функции A=f(x,y,z), здесь A=x+y+z.

from scipy.interpolate import interpn 
import numpy as np 

#make up a regular 3d grid 
X=np.linspace(-5,5,11) 
Y=np.linspace(-5,5,11) 
Z=np.linspace(-5,5,11) 
xv,yv,zv = np.meshgrid(X,Y,Z) 

# make up a function 
# see http://docs.scipy.org/doc/numpy/reference/ufuncs.html 
A = np.add(xv,np.add(yv,zv)) 
#this one is easy enough for us to know what to expect at (.5,.5,.5) 

# usage : interpn(points, values, xi, method='linear', bounds_error=True, fill_value=nan) 
interpn((X,Y,Z),A,[0.5,0.5,0.5]) 

Выход:

array([ 1.5]) 

Если вы передаете массив точек интереса, это даст вам несколько ответов.