我有一个大小为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在一个甚至不接近Zero Vector的向量上返回0的范数?
答案 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