Как сделать векторизованный подход для расчета попарного расстояния Манхэттен / L1 между многомерными массивами? - PullRequest
0 голосов
/ 15 февраля 2019

Допустим, у меня есть два массива размера (4000, 3).Векторизованным способом я хотел бы рассчитать расстояние L1 / Манхэттен от каждого вектора первого массива до каждого вектора во втором массиве, чтобы в итоге я получил массив (4000, 4000).

Мой текущий подход основан на разделении (4000, 3) на 3 отдельных массива (4000, 1) и выполнении широковещания (аналогично здесь: Альтернатива Python для вычисления попарного расстояния между двумя наборами2d баллов ).

Однако этот подход не работает, если у меня есть исходные матрицы, которые различаются по размеру, например, (4000, 4) или (4000, 5).Тогда мой код сломается, потому что предполагается, что есть 3 канала.

Поэтому, я был бы признателен за любую помощь в создании обобщенного векторизованного подхода, который может вычислять попарные расстояния L1!

1 Ответ

0 голосов
/ 15 февраля 2019

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

N = 4000
k = 4

X = np.random.rand(N,k)
Y = np.random.rand(N,k)

Z = np.sum(np.abs(X[:,None]-Y[:]),axis=-1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...