我想将NumPy数组转换为单位向量。更具体地说,我正在寻找这个归一化函数的等效版本:

def normalize(v):
    norm = np.linalg.norm(v)
    if norm == 0: 
       return v
    return v / norm

这个函数处理向量v的范数为0的情况。

在sklearn或numpy中是否提供了类似的函数?


当前回答

如果你不需要最大的精度,你的函数可以简化为:

v_norm = v / (np.linalg.norm(v) + 1e-16)

其他回答

如果你想将存储在3D张量中的n维特征向量归一化,你也可以使用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()

如果你在使用scikit-learn,你可以使用sklearn.预处理。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

不使用sklearn,只使用numpy。 只需定义一个函数:。

假设行是变量,列是样本(轴= 1):

import numpy as np

# Example array
X = np.array([[1,2,3],[4,5,6]])

def stdmtx(X):
    means = X.mean(axis =1)
    stds = X.std(axis= 1, ddof=1)
    X= X - means[:, np.newaxis]
    X= X / stds[:, np.newaxis]
    return np.nan_to_num(X)

输出:

X
array([[1, 2, 3],
       [4, 5, 6]])

stdmtx(X)
array([[-1.,  0.,  1.],
       [-1.,  0.,  1.]])

如果你不需要最大的精度,你的函数可以简化为:

v_norm = v / (np.linalg.norm(v) + 1e-16)

如果你想要[0;1]为1d-array,然后使用

(a - a.min(axis=0)) / (a.max(axis=0) - a.min(axis=0))

a是你的一维数组。

一个例子:

>>> a = np.array([0, 1, 2, 4, 5, 2])
>>> (a - a.min(axis=0)) / (a.max(axis=0) - a.min(axis=0))
array([0. , 0.2, 0.4, 0.8, 1. , 0.4])

注意该方法。对于保存值之间的比例有一个限制:一维数组必须至少有一个0,并且由0和正数组成。