У меня есть облако точек в 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])
Ваша реализация кажется ОК. если вас интересует количество при интерполяции количества только в одной точке. Однако, если вы хотите сделать это для других точек, это кажется очень неэффективным. Есть способ сделать интерполяцию на основе соседей, но не могли бы вы указать, почему вы хотите сделать это, используя соседние частицы? – Alejandro
Когда вы запускаете скрипт, вы получаете сегмент линии через облако частиц. В конечном счете, давайте представим, что сегмент линии состоит из 5 пунктов. В первой точке сегмента линии я хотел бы найти ближайшие N точек в облаке точек. Затем я хочу интерполировать ближайшие значения N облака точек, чтобы найти значение в первой точке сегмента линии. Затем я повторю это для второго пункта и так далее. – AaronJPung
Редактировать: облако точек основано на наборе данных в 3d-пространстве. Я считаю, что лучший способ найти значение в данной точке пространства - это использовать точки данных, наиболее близкие к интересующей точке (например, первая точка на сегменте линии). – AaronJPung