【问题标题】:Numpy's linalg.norm() returning 0 on non-zero-vector?Numpy linalg.norm() 在非零向量上返回 0?
【发布时间】:2015-08-20 23:13:55
【问题描述】:

我有一个大小为 268800 的 numpy 数组。我使用这个数组作为反向传播算法的输入向量,我想对其进行规范化。但是,当我尝试时会发生一些奇怪的事情;向量的大小返回为 0,我得到错误:

Backpropagator.py:56: RuntimeWarning: divide by zero encountered in true_divide
  x = input.x/np.linalg.norm(input.x)
Backpropagator.py:56: RuntimeWarning: invalid value encountered in true_divide
  x = input.x/np.linalg.norm(input.x)

我不明白这在数学上是如何发生的。如果我们采用 n 维向量的欧几里得范数,范数可以为 0 的唯一情况是当向量是零向量时。

但是我正在操作的向量不是零向量,您可以清楚地看到here

奇怪的是,当我使用 Numpy 的 dot() 方法时,也会出现同样的问题。

那么,什么可能导致 numpy 在一个甚至不接近零向量的向量上返回 0 范数?

【问题讨论】:

    标签: python numpy linear-algebra


    【解决方案1】:

    您的数组 dtype 是 uint8。该类型仅处理 0 到 255 之间的整数:

    >>> arr = np.array([255,255,255], dtype=np.uint8)
    >>> arr
    array([255, 255, 255], dtype=uint8)
    >>> arr + 1
    array([0, 0, 0], dtype=uint8)
    

    所以

    >>> arr.dot(arr)
    3
    >>> (arr.dot(arr))**0.5
    1.7320508075688772
    >>> np.linalg.norm(arr)
    1.7320508
    >>> arr[0]*arr[0]
    1
    >>> arr[0]*arr[0] + arr[1]*arr[1] + arr[2]*arr[2]
    3
    

    如果您想要不同的结果,请将 dtype 更改为更广泛的内容,无论是显式还是隐式:

    >>> np.linalg.norm(arr*1.0)
    441.67295593006372
    

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多