Numpy - Найти трехмерное расстояние до контрольной точки для всех точек сетки на трехмерной сетке.
Я пробовал np.hypot () и np.linalg.norm (), но у них обоих есть некоторые проблемы (по крайней мере, как я использую thm).
Я почти уверен, что np.hypot может рассчитать только 2-е расстояние. Если у меня есть контрольная точка P (1,1,1) и точка сетки G (3,3,3), то возвращаемое значение точки сетки G будет примерно таким: ((3-1)^2+(3-1)^2)^(0,5) = 2,82
Я могу сделать прямой вызов np.hypot без необходимости циклически проходить через точки сетки (циклы, я думаю, медленные, а потому и плохие), и я получаю эти значения расстояния до контрольной точки, возвращаемые во всех точках сетки моего 3-го сетка, но зависимость z не рассчитывается (то есть d при (1,2,0) = d при (1,2,3):
#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.hypot(xx-1,yy-1,zz-1)
С помощью np.linalg.norm я не знаю, как получить возвращенные значения, вычисленные поэлементно во всех точках моей сетки, передаваемые параметры кажутся точкой A (точка сетки) и точкой B (контрольная точка), но затем я не могу придумать способ вычисления для всех точек сетки, кроме циклического, как показано ниже:
for i in x:
for j in y:
for k in z:
#not mapped back to a gridpoint, do not know what to do
d = np.linalg.norm(np.array([i,j,k])-point)
Кто-нибудь знает, как я могу найти реальное трехмерное расстояние до контрольной точки для всех моих точек сетки на трехмерной сетке?
2 ответа
Как насчет просто:
d = np.sqrt((point[0]-xx)**2 + (point[1]-yy)**2 + (point[2]-zz)**2)
Вот простая функция для вычисления взаимного расстояния n-мерных векторов:
def _distance2(v):
nrm=np.sum(v**2,axis=0,keepdims=True)
return nrm+nrm.T-2* v.T @ v
Строки - это точки, а столбцы - размеры, поэтому в вашем случае вы можете просто сгладить данные. Вы также можете использовать общую идею, чтобы манипулировать ею в любой форме, в которой находятся ваши данные.