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您是对的。