2017-03-24 4 views
0
次関数は3DはN = 1の場合、Nは> 1、Iは ValueError: 'axis' entry is out of boundsを得たときにそれが動作

numpyの

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

ベクトル正規化しようと

と異なる入力サイズのベクトルを正規化する方法があります。私は両方の場合に対処するために次のチェックを行うことができますが、よりクリーンな方法があるのだろうか?

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

最初の解決策は1X3アレイで機能するはずですが、(1,3)の代わりに(3)の配列を渡している可能性があります。 – Psidom

+0

@Psidomそうです。 – nos

答えて

2

使用axis=-1keepdims=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]])