How to normalize a NumPy array to a unit vector?
If you're using scikit-learn you can use sklearn.preprocessing.normalize
:
import numpy as npfrom sklearn.preprocessing import normalizex = np.random.rand(1000)*10norm1 = x / np.linalg.norm(x)norm2 = normalize(x[:,np.newaxis], axis=0).ravel()print np.all(norm1 == norm2)# True
I would agree that it were nice if such a function was part of the included batteries. But it isn't, as far as I know. Here is a version for arbitrary axes, and giving optimal performance.
import numpy as npdef normalized(a, axis=-1, order=2): l2 = np.atleast_1d(np.linalg.norm(a, order, axis)) l2[l2==0] = 1 return a / np.expand_dims(l2, axis)A = np.random.randn(3,3,3)print(normalized(A,0))print(normalized(A,1))print(normalized(A,2))print(normalized(np.arange(3)[:,None]))print(normalized(np.arange(3)))
This might also work for you
import numpy as npnormalized_v = v / np.sqrt(np.sum(v**2))
but fails when v
has length 0.
In that case, introducing a small constant to prevent the zero division solves this.