Numpy 的 linalg.norm() 在非零向量上返回 0?

Numpy's linalg.norm() returning 0 on non-zero-vector?

我有一个大小为 268800 的 numpy 数组。我将这个数组用作反向传播算法的输入向量,我想对其进行归一化。但是,当我尝试时会发生一些奇怪的事情;矢量 returns 的大小为 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 return 在甚至不接近零向量的向量上的范数为 0?

您的数组 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

如果您想要不同的结果,请将数据类型显式或隐式更改为更广泛的内容:

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