Numpy - Найти пространственную позицию точки сетки в трехмерной матрице (зная индекс этой точки сетки) - PullRequest
0 голосов
/ 12 июня 2018

Так что я думаю, что могу оказаться на неправильном пути, но в основном

У меня есть 3-я сетка, я нахожу все расстояния до контрольной точки во всех точках этой сетки

import numpy as np
#crystal_lattice structure
x,y,z = np.linspace(-2,2,5),np.linspace(-2,2,5),np.linspace(-2,2,5)
xx,yy,zz = np.meshgrid(x,y,z)

#testpoint
point = np.array([1,1,1])

d = np.sqrt((point[0]-xx)**2 + (point[1]-yy)**2 + (point[2]-zz)**2)

#np.shape(d) = (5, 5, 5)

Затем я пытаюсь найти координаты точки сетки, ближайшей к этой контрольной точке.Моя идея состояла в том, чтобы отсортировать d (сгладить, затем выполнить поиск), получить индекс наименьшего значения.

low_to_hi_d = np.sort(d, axis=None)  # axis=0 flattens the d, going to flatten the entire d array and then search
lowest_val = low_to_hi_d[0]
index = np.where(d == lowest_val)

#how do I get the spatial coordinates of my index, not just the position in ndarray (here the position in ndarray is (3,3,3) but the spatial position is (1,1,1), but if I do d[3,3,3] I get 0 (the value at spatial position (1,1,1))

Использовать этот индекс на моей трехмерной сетке, чтобы найти координаты точки (не значение d в этой точке),Я пытаюсь что-то вроде этого, и я уверен, что я слишком усложняю это. Как я могу получить (x, y, z) 3-й точки сетки, которая находится ближе всего к моей контрольной точке?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Если вы просто хотите найти координаты ближайшей точки, в которой вы правы, вы на неправильном пути.Нет смысла генерировать сетку и вычислять расстояние для такого количества дубликатов.Вы можете сделать это в любом измерении легко и независимо:

import numpy as np
x,y,z = np.linspace(-2,2,5),np.linspace(-2,2,5),np.linspace(-2,2,5)
p=np.array([1,1,1])
closest=lambda x,p: x[np.argmin(np.abs(x-p))]
xc,yc,zc=closest(x,p[0]),closest(y,p[1]),closest(z,p[2])
0 голосов
/ 12 июня 2018

Я не совсем уверен, что это то, что вы хотите.

Вы можете найти минимальный индекс d с помощью:

idx = np.unravel_index(np.argmin(d), d.shape)

(3, 3, 3)

и использовать его для индексации вашегосетка:

xx[idx], yy[idx], zz[idx]

(1.0, 1.0, 1.0)
...