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

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

我有一个大小为 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 的only情况。

然而,作的向量不是零向量,你可以清楚地看到here

enter image description here

enter image description here

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

enter image description here

那么,什么可能导致 numpy 在一个甚至不接近零向量的向量上返回一个 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)

And so

>>> 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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(201)
熊猫的升级版(update pandas library)
上一篇
熊猫的升级版(update pandas library)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(49条)