Как список векторов может быть изящно нормализован в 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
действительно работает (согласно моему ответу ниже)?
Ну, если я что-то не пропустил, это действительно работает:
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
Alright: Трансляция формы массива в NumPy добавляет размеры к левой части формы массива, а не к правой. Однако NumPy можно указать добавить размерность справа от норм
массива:
print vectors.T / norms[:, newaxis]
работает!