假设我有这两个变量:
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()
看起来相等?
有微小的数值误差:
>>> m1.tolist()
[[-116.49999999999999, -346.0, -73.5]]
>>> m2.tolist()
[[-116.5, -346.0, -73.5]]