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

时间:2015-08-20 23:13:56

标签: python numpy linear-algebra

我有一个大小为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

enter image description here

enter image description here

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

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