Эффективный способ вычисления матрицы расстояний в NumPy

1

У меня есть этот массив образцов:

In [38]: arr
Out[38]: array([  0,  44, 121, 154, 191])

Вышеприведенное является просто образцом, тогда как мой фактический размер массива довольно большой. Итак, что является эффективным способом вычисления матрицы расстояния?

Результат должен быть:

In [41]: res
Out[41]: 
array([[   0,   44,  121,  154,  191],
       [ -44,    0,   77,  110,  147],
       [-121,  -77,    0,   33,   70],
       [-154, -110,  -33,    0,   37],
       [-191, -147,  -70,  -37,    0]])

Я написал слишком медленную реализацию for основе цикла. Может ли это быть векторизовано по соображениям эффективности?

Теги:
arrays
numpy
multidimensional-array
vectorization

2 ответа

1
Лучший ответ

Там subtract. outer, который эффективно выполняет транслируемое вычитание между двумя массивами.

Примените ufunc op ко всем парам (a, b) с a в и b из B.

Пусть M = A.ndim, N = B.ndim. Тогда результат C, op.outer(A, B) представляет собой массив размерности M + N такой, что:

C[i_0, ..., i_{M-1}, j_0, ..., j_{N-1}] = 
     op(A[i_0, ..., i_{M-1}],B[j_0, ..., j_{N-1}])
np.subtract.outer(arr, arr).T

Или же,

arr - arr[:, None] # essentially the same thing as above

array([[   0,   44,  121,  154,  191],
       [ -44,    0,   77,  110,  147],
       [-121,  -77,    0,   33,   70],
       [-154, -110,  -33,    0,   37],
       [-191, -147,  -70,  -37,    0]])
  • 1
    @ kmario23 это транслируемая версия того же самого ufunc. Я добавил ссылку, дайте мне знать, если она все еще не имеет смысла.
2

Вы можете использовать трансляцию:

from numpy import array

arr = array([  0,  44, 121, 154, 191])
arrM = arr.reshape(1, len(arr))
res = arrM - arrM.T
  • 0
    Вы всегда можете сделать arrM = arr.reshape(1, -1) когда это будет однозначно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню