как часть пакетного евклидово расстояние вычисления, я вычисленияСумма над квадратом массива
(X * X).sum(axis=1)
, где X
является достаточно большой 2-D массив. Это прекрасно работает, но он создает временный массив того же размера, что и X
. Есть ли способ избавиться от этого временного, но сохранить эффективность векторной операции?
Очевидным кандидатом,
np.array([np.dot(row, row) for row in X])
работает, но использует список Python в качестве временного, что делает его довольно медленно.
Без axis
, память-эффективная форма будет
(X * X).sum() => np.dot(X.ravel(), X.ravel())
, и я знаю, что, когда axis=1
, это эквивалентно
np.diag(np.dot(X, X.T))
который заставил меня смотреть в обобщениях dot
, таких как np.inner
, np.tensordot
и np.einsum
, но я не могу понять, как они решат мою проблему.
Вы должны проверить следующее: http://stackoverflow.com/questions/17527340/more-efficient-way-to-calculate-distance-in-numpy Для больших массивов макет памяти становится очень важным, по-видимому, – usethedeathstar
@usethedeathstar : Я знаю об этом; Евклидово расстояние - это точечный продукт плюс сумма двух из приведенных выше операций, а макет уже оптимизирован для точечного продукта. –