NumPy: как быстро нормализовать много векторов?

Как список векторов может быть изящно нормализован в NumPy?

Вот пример, который не работает:

from numpy import *

vectors = array([arange(10), arange(10)])  # All x's, then all y's
norms = apply_along_axis(linalg.norm, 0, vectors)

# Now, what I was expecting would work:
print vectors.T / norms  # vectors.T has 10 elements, as does norms, but this does not work

Последняя операция приводит "к несоответствию формы: объекты не могут быть широковещательно переданы к единственной форме".

Как может нормализация 2D векторов в vectors будьте изящно сделаны с NumPy?

Править: Почему вышеупомянутое не работает при добавлении размера к norms действительно работает (согласно моему ответу ниже)?

20
задан Eric O Lebigot 17 May 2010 в 16:13
поделиться

2 ответа

Ну, если я что-то не пропустил, это действительно работает:

vectors / norms

Проблема в вашем предложении - правила вещания.

vectors  # shape 2, 10
norms  # shape 10

Форма не одинаковой длины! Итак, правило состоит в том, чтобы сначала удлинить маленькую фигуру на единицу слева :

norms  # shape 1,10

Вы можете сделать это вручную, вызвав:

vectors / norms.reshape(1,-1)  # same as vectors/norms

Если вы хотите вычислить vectors.T / norm , вам придется выполнить изменение формы вручную, как показано ниже:

vectors.T / norms.reshape(-1,1)  # this works
14
ответ дан 29 November 2019 в 22:43
поделиться

Alright: Трансляция формы массива в NumPy добавляет размеры к левой части формы массива, а не к правой. Однако NumPy можно указать добавить размерность справа от норм массива:

print vectors.T / norms[:, newaxis]

работает!

13
ответ дан 29 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: