Numpy - Find spatial position of a gridpoint in 3-d matrix (knowing the index of that gridpoint)

若如初见. 提交于 2019-12-11 06:05:21

问题


So I think I might be absolutely on the wrong track here, but basically

I have a 3-d meshgrid, I find all of the distances to a testpoint at all of the points in that grid

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)

Then I am trying to find the coordinates of he gridpoint that is the closest to that test point. My idea was to sort d (flatten then search), get the index of the lowest value.

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))

Use that index on my 3d grid to find the point coordinates (not the d value at that point). I am trying something like this, and I am pretty sure I am overcomplicating it. How can I get the (x,y,z) of the 3-d gridpoint that is closest to my test point?


回答1:


If you just want to find the coordinates of the closest point you are right, you're on the wrong track. There is no point in generating a meshgrid and calculate the distance on so many duplicates. You can do it in every dimension easily and independently:

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])



回答2:


I'm not completely sure that this is what you want.

You can find the index of the minimum d with:

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

(3, 3, 3)

and use this to index your meshgrid:

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

(1.0, 1.0, 1.0)


来源:https://stackoverflow.com/questions/50820734/numpy-find-spatial-position-of-a-gridpoint-in-3-d-matrix-knowing-the-index-of

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!