Векторизованное пространственное расстояние между значениями в многомерных массивах
Учитывая (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)
...