在NumPy数组标准化中处理零值

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?(我可以编写循环来实现此操作 - 只是想知道是否有 numpy 的方法可以完成此操作)

或者,在跳过所有零向量的情况下,是否有更好的规范化向量数组的方法?


np.linalg.norm有第二个参数axis,您可以使用它来提高速度,如此处所述:https://dev59.com/8msz5IYBdhLWcg3wrJsx#19794741 - 0 _
3个回答

7
如果您可以在原地进行归一化,您可以像这样使用布尔索引数组:
nonzero = norms > 0
x[nonzero] /= norms[nonzero]

2
这是一种可能的实现方式。
norms = np.sqrt((x**2).sum(axis=1,keepdims=True))
x[:] = np.where(norms!=0,x/norms,0.)

这里使用np.where进行所需的替换。
注意:在这种情况下,x会被就地修改。

1
你比我快了几秒钟!为了原地操作,我认为最好使用布尔索引数组:idx = (norms != 0); x[idx] /= norms[idx] - Jaime
@Jaime - 谢谢!请将其发布为答案,以便我可以给你信用。 - M-V

1

最简单的方法可能是先进行计算,然后修改结果以符合您的要求:

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

#y = array([[ 0.,  0.],
#       [ 0.,  0.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接