Python 有没有办法用numpy规范化不同输入大小的向量

Python 有没有办法用numpy规范化不同输入大小的向量,python,numpy,Python,Numpy,以下函数尝试规格化三维向量 def my_norm(v): """ @type v: Nx3 numpy array """ return v / numpy.linalg.norm(v, axis=1)[:, None] 当N>1时,它工作。对于N=1,我得到了ValueError:“axis”条目超出了范围。我可以做以下检查来处理这两种情况,但我想知道是否有更干净的方法 def my_norm(v): """ @type v: Nx3 nu

以下函数尝试规格化三维向量

def my_norm(v):
    """
    @type v: Nx3 numpy array
    """
    return v / numpy.linalg.norm(v, axis=1)[:, None] 
当N>1时,它工作。对于N=1,我得到了
ValueError:“axis”条目超出了范围
。我可以做以下检查来处理这两种情况,但我想知道是否有更干净的方法

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] 

使用
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]])

使用
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]])

第一个解决方案适用于1X3数组,错误提示您可能传递的是(3,)数组而不是(1,3)。@Psidom您是对的。第一个解决方案适用于1X3数组,错误提示您可能传递的是(3,)数组而不是(1,3)。@Psidom您是对的。