Numpy - Найти трехмерное расстояние до контрольной точки для всех точек сетки на трехмерной сетке. - PullRequest
0 голосов
/ 12 июня 2018

Я попробовал np.hypot () и np.linalg.norm (), но у них обоих есть некоторые проблемы (по крайней мере, как я использую thm).

Я почти уверен, что np.Гипот может рассчитать только 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 ]

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

Вот простая функция для вычисления взаимного расстояния n-мерных векторов:

def _distance2(v):
    nrm=np.sum(v**2,axis=0,keepdims=True)
    return nrm+nrm.T-2* v.T @ v

Строки - это точки, а столбцы - размеры, поэтому в вашем случае вы можете просто сгладить данные.Вы также можете использовать общую идею для манипулирования ею в любой форме, в которой находятся ваши данные.

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

Как насчет просто:

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