为什么使用 np.linalg.norm 会引入看不见的数值不等式,但写出来却不会?

问题描述 投票:0回答:1

假设我有这两个变量:

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

方法1

m1 = -np.linalg.norm(a[:, np.newaxis, :] - b[np.newaxis, :, :], axis=-1) ** 2 / 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()
看起来相等?

python-3.x numpy linear-algebra
1个回答
0
投票

有微小的数值误差:

>>> m1.tolist()
[[-116.49999999999999, -346.0, -73.5]]

>>> m2.tolist()
[[-116.5, -346.0, -73.5]]
© www.soinside.com 2019 - 2024. All rights reserved.