Как нормализовать массив в NumPy?
Я хотел бы иметь норму одного массива NumPy. Более конкретно, я ищу эквивалентную версию этой функции
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
есть что-то подобное в skearn или numpy?
эта функция работает в ситуации, где v - это вектор 0.
7 ответов:
Если вы используете scikit-узнайте, что вы можете использовать
sklearn.preprocessing.normalize:import numpy as np from sklearn.preprocessing import normalize x = np.random.rand(1000)*10 norm1 = x / np.linalg.norm(x) norm2 = normalize(x[:,np.newaxis], axis=0).ravel() print np.all(norm1 == norm2) # True
Я бы согласился, что было бы неплохо, если бы такая функция была частью включенных батарей. Но это не так, насколько я знаю. Вот версия для произвольных осей, и дающая оптимальную производительность.
import numpy as np def 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)))
вы можете указать ord, чтобы получить норму L1. Чтобы избежать нулевого деления, я использую eps, но это, возможно, не очень хорошо.
def normalize(v): norm=np.linalg.norm(v, ord=1) if norm==0: norm=np.finfo(v.dtype).eps return v/norm
Если у вас есть многомерные данные и вы хотите, чтобы каждая ось нормализовалась к себе:
def normalize(d): # d is a (n x dimension) np array d -= np.min(d, axis=0) d /= np.ptp(d, axis=0) return dиспользует numpys пика до пика
Это также может работать для вас
import numpy as np normalized_v = v / np.sqrt((np.sum(v**2)))но не когда
vимеет длину 0.
есть также функция
unit_vector()для нормализации векторов в популярном преобразования модуль Кристофа Голке:import transformations as trafo import numpy as np data = np.array([[1.0, 1.0, 0.0], [1.0, 1.0, 1.0], [1.0, 2.0, 3.0]]) print(trafo.unit_vector(data, axis=1))
Если вы хотите нормализовать N векторов пространственных объектов, хранящихся в 3D Тензоре, вы также можете использовать PyTorch:
import numpy as np from torch import FloatTensor from torch.nn.functional import normalize vecs = np.random.rand(3, 16, 16, 16) norm_vecs = normalize(FloatTensor(vecs), dim=0, eps=1e-16).numpy()
Comments