python - 防止 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,因为我正在处理图像数据并且它的内存更少。
解决方案
你可以试试:
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))
推荐阅读
- ios - LazyVGrid 中的 NavigationLink 循环返回所有条目,SwiftUI
- python-3.x - 为什么导入的值不可调用
- css - 在 Google Chrome 中运行 CSS 动画时边界半径中断
- sql-server - 如何在购物车中选择最小订购产品超过 8 小时的全套产品
- .net - 带有逗号分隔字符串的正则表达式,由.NET中的管道符号分隔
- python - 如何在不使用结构的情况下解决这个问题?(超过时限)
- python - Django CreateView - 如果字段为空,则不要创建对象,而是重定向到不同的视图。我该怎么做呢?
- sql - 找到快乐的鸭子 sql 谜题
- ms-access - 无法找到在另一个查询中引用的查询
- sql - 如何在 Microsoft SQL Server 管理中更改表的列数据类型