У меня есть этот массив образцов:
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
основе цикла. Может ли это быть векторизовано по соображениям эффективности?
Там 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]])
Вы можете использовать трансляцию:
from numpy import array
arr = array([ 0, 44, 121, 154, 191])
arrM = arr.reshape(1, len(arr))
res = arrM - arrM.T
arrM = arr.reshape(1, -1)
когда это будет однозначно