有没有办法用numpy标准化具有不同输入大小的向量

时间:2017-03-24 18:10:50

标签: python numpy

以下函数尝试标准化3D矢量

def my_norm(v):
    """
    @type v: Nx3 numpy array
    """
    return v / numpy.linalg.norm(v, axis=1)[:, None] 

当N>时,它起作用1.对于N = 1,我得到ValueError: 'axis' entry is out of bounds。我可以做以下检查以处理这两种情况,但我想知道是否有更清洁的方法?

def my_norm(v):
    """
    @type v: Nx3 numpy array
    """
    if len(v) == 1:
        return v / numpy.linalg.norm(v)
    return v / numpy.linalg.norm(v, axis=1)[:, None] 

1 个答案:

答案 0 :(得分:2)

使用axis=-1并将尺寸与keepdims=True -

保持一致
v/np.linalg.norm(v, axis=-1,keepdims=True)

示例运行

1D案例:

In [61]: v = np.random.rand(6)

In [62]: v/np.linalg.norm(v)
Out[62]: array([ 0.22,  0.1 ,  0.28,  0.58,  0.64,  0.33])

In [63]: v/np.linalg.norm(v, axis=-1,keepdims=True)
Out[63]: array([ 0.22,  0.1 ,  0.28,  0.58,  0.64,  0.33])

2D案例:

In [58]: v = np.random.rand(4,6)

In [59]: v / np.linalg.norm(v, axis=1)[:, None]
Out[59]: 
array([[ 0.53,  0.04,  0.38,  0.21,  0.58,  0.43],
       [ 0.49,  0.4 ,  0.02,  0.56,  0.38,  0.38],
       [ 0.05,  0.49,  0.45,  0.18,  0.54,  0.47],
       [ 0.45,  0.61,  0.19,  0.1 ,  0.14,  0.61]])

In [60]: v/np.linalg.norm(v, axis=-1,keepdims=True)
Out[60]: 
array([[ 0.53,  0.04,  0.38,  0.21,  0.58,  0.43],
       [ 0.49,  0.4 ,  0.02,  0.56,  0.38,  0.38],
       [ 0.05,  0.49,  0.45,  0.18,  0.54,  0.47],
       [ 0.45,  0.61,  0.19,  0.1 ,  0.14,  0.61]])