【问题标题】:Dealing with zeros in numpy array normalization处理 numpy 数组归一化中的零
【发布时间】:2013-07-21 05:21:41
【问题描述】:

我有一个 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 方法)

或者有没有更好的方法来规范化向量数组,在过程中跳过所有零向量?

【问题讨论】:

标签: python numpy


【解决方案1】:

如果您可以就地进行标准化,您可以像这样使用布尔索引数组:

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 - 谢谢!请将其发布为答案,以便我给予您信任。
    【解决方案3】:

    进行计算然后将结果修改为您想要的结果可能是最简单的:

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

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 2013-10-15
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2020-10-28
      • 2012-09-16
      相关资源
      最近更新 更多