首页 > 解决方案 > 防止 numpy.linalg.norm 方法将值裁剪为输入 dtype min/max

问题描述

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

当我运行 np.linalg.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,因为我正在处理图像数据并且它的内存更少。

标签: pythonpython-3.xnumpynumpy-ndarray

解决方案


你可以试试:

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

推荐阅读