2013-09-30 3 views
9

как часть пакетного евклидово расстояние вычисления, я вычисленияСумма над квадратом массива

(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, но я не могу понять, как они решат мою проблему.

+0

Вы должны проверить следующее: http://stackoverflow.com/questions/17527340/more-efficient-way-to-calculate-distance-in-numpy Для больших массивов макет памяти становится очень важным, по-видимому, – usethedeathstar

+0

@usethedeathstar : Я знаю об этом; Евклидово расстояние - это точечный продукт плюс сумма двух из приведенных выше операций, а макет уже оптимизирован для точечного продукта. –

ответ

11

einsum эквивалент:

np.einsum('ij,ij->i', X, X) 

Хотя я не уверен, как это работает внутри, так что может или не может не решить вашу проблему.

+0

Первый тест показывает, что он очень быстрый. Я сделаю некоторое профилирование памяти. –

+5

Einsum, вероятно, одна из лучших функций numpy для обработки больших массивов. Он полностью скомпилирован в C и использует SSE2, которые umuncs numpy не будут использовать до 1,8. Также он пытается избежать большого количества промежуточных чисел в памяти. Исходный код [здесь] (https://github.com/numpy/numpy/blob/6f9a41276153187a4c6e45eb0b8a9999d946608d/numpy/core/src/multiarray/einsum.c.src). – Daniel

+5

Другой альтернативой является 'inner1d':' numpy.core.umath_tests import inner1d; inner1d (X, X) ', но' np.einsum' выполняется чаще всего в большинстве случаев или в большинстве систем. – Jaime

Смежные вопросы