假设我有两个变量:
import numpy as np
a = np.array([[ 0, 1, 10, 2, 5]])
b = np.array([[ 0, 1, 18, 15, 5],
[13, 9, 23, 3, 22],
[ 2, 10, 17, 4, 8]])
字符串
方法一
m1 = -np.linalg.norm(a[:, np.newaxis, :] - b[np.newaxis, :, :], axis=-1) ** 2 / 2
型
方法二
m2 = -np.sum(np.square(a[:, np.newaxis, :] - b[np.newaxis, :, :]), axis=-1) / 2
型
这两个输出看起来很相似(至少根据print()
):
array([[-116.5, -346. , -73.5]])
型
但
>>> np.array_equal(m1, m2)
False
型
有趣的是,定义一个文字来检查相等性会导致:
>>> sanity_check = np.array([[-116.5, -346. , -73.5]])
>>> np.array_equal(sanity_check, m1)
False
>>> np.array_equal(sanity_check, m2)
True
型
为什么使用np.linalg.norm
的方法是奇数?如果m1
不相等,为什么它的print()
看起来相等?
2条答案
按热度按时间wkyowqbh1#
实际值中存在少量的数值误差:
字符串
这是因为:
型
NumPy的
printoptions
控制打印多少位数字。默认情况下,它们是:型
omtl5h9j2#
基本上,浮点运算只提供近似结果。非常好的近似值,但根据计算的执行方式而有所不同。
对于这类指向What Every Programmer Should Know About Floating-Point Arithmetic的问题,应该有一个规范的答案。