防止numpy.linal .norm方法裁剪值到输入dtype min/max



我有这两个NumPy数组为例:a = np.array([[0, 0, 0]], dtype=np.uint8) b = np.array([[130, 130, 130],[254, 254, 254]], dtype=np.uint8)

,当我运行np. linalgu .norm()计算点a和点b之间的欧氏距离时:np.linalg.norm((a-b), axis=1)它返回[218.2,3.4],这对于第一个返回值来说是有意义的,但第二个值只有3.4,应该更高。由于254接近无符号8位整数的int限制,并且由于numpy不箝位它的数组,它基本上是计算254和超过限制的一个值之间的距离,这个值只有2个距离。有没有一种方法可以让它在不溢出的情况下计算距离,从而使[0,0,0]和[254,254,254]之间的距离返回大约439.9而不是3.4。当我将两个数组的dtypes都更改为int16时,显然它解决了问题,因为int16的限制更高。然而,我宁愿使用uint8s,因为我正在处理图像数据,它的内存更少。

您可以尝试:

import numpy as np
a = np.array([[0, 0, 0]], dtype=np.uint8)
b = np.array([[130, 130, 130],[254, 254, 254]], dtype=np.uint8)
print(np.linalg.norm(np.maximum(a,b)-np.minimum(a,b),  axis=1))

最新更新