Векторизованное пространственное расстояние между значениями в многомерных массивах

Учитывая (2,2,3,3,3) массив трехмерных декартовых координат по последнему измерению, каков синтаксис для вычисления евклидова между попарными значениями в XA и XB с использованием scipy.spatial.distance.cdist получить выходной массив с формой (2, 3, 3)?

XA = np.random.normal(size=(2,2,3,3,3))
XB = np.random.normal(size=(2,2,3,3,3))
dist = cdist(XA[:, 0, ...], XB[:, 1, ...], 'seuclidean')

Возвращает ValueError: XA must be a 2-dimensional array, Таким образом, альтернатива циклам, каков питонический синтаксис для вычислений cdist(XA[:, 0], XB[:, 1])?

1 ответ

Решение

Это делает работу? если нужны только попарные расстояния, а координаты находятся в последнем измерении:

import numpy as np

XA = np.random.normal(size=(2,2,3,3,3))
XB = np.random.normal(size=(2,2,3,3,3))

distances = np.sqrt(np.sum((XA - XB)**2, axis=-1))

но здесь distances.shape является (2, 2, 3, 3)...

Другие вопросы по тегам