6

以下のように正規化しようとしている 2D ベクトルの numpy 配列があります。配列には、大きさがゼロのベクトルを含めることができます。

x = np.array([[0.0, 0.0], [1.0, 0.0]])
norms = np.array([np.linalg.norm(a) for a in x])

>>> x/norms
array([[ nan,   0.],
       [ inf,   0.]])

>>> nonzero = norms > 0.0
>>> nonzero
array([False,  True], dtype=bool)

そのようなものだけnonzeroに除算を適用するためにどういうわけか使用できますか? (私はこれのためにループを書くことができます - これを行うための面倒な方法があるかどうか疑問に思っています)x[i]nonzero[i]True

または、ベクトルの配列を正規化し、その過程ですべてのゼロ ベクトルをスキップするより良い方法はありますか?

4

3 に答える 3

6

その場で正規化できる場合は、次のようにブール値のインデックス配列を使用できます。

nonzero = norms > 0
x[nonzero] /= norms[nonzero]
于 2013-07-21T05:53:44.630 に答える
2

これを行う1つの可能な方法を次に示します

norms = np.sqrt((x**2).sum(axis=1,keepdims=True))
x[:] = np.where(norms!=0,x/norms,0.)

これは np.where を使用して、必要な置換を行います。

注: この場合、x はその場で変更されます。

于 2013-07-21T05:51:57.807 に答える
1

計算を行ってから、結果を希望どおりに変更するのがおそらく最も簡単です。

y = x/norms
y[np.isnan(y) | np.isinf(y)]=0

#y = array([[ 0.,  0.],
#       [ 0.,  0.]])
于 2013-07-21T05:51:05.730 に答える