numpy的linalg规范轴不会输出相同的结果

时间:2019-12-05 11:13:05

标签: python numpy

我正在尝试使用numpy最大化计算性能(删除python for loop)。这是我最初的实现方式

np.random.seed(128)
l = []
for i in range(1000): 
    v = np.random.randn(7)
    l.append(np.linalg.norm(v))

l = np.array(l)
l

以上代码仅采用大小为7的向量的Frobenius范数,并将其附加到列表中。重复1000次。为了删除for循环,我构造了一个大小为(1000,7)的矩阵,然后采用轴= 1的矩阵范数,如下所示。

np.random.seed(128)
v = np.random.randn(1000, 7)
v = np.linalg.norm(v, axis=1)

但是,当我检查lvnp.all(l == v)是否相等时,它将为我输出False。我不明白为什么numpy会这样表现。我检查了vl的值的dtype,它们都是np.float64

1 个答案:

答案 0 :(得分:1)

您可以阅读以下issue

据说在那里:

  

numpy通常不保证在语义上等效   这样的操作将产生相同的结果。均匀作业   像sum可以产生不同的结果,具体取决于内存布局(和   这是故意的-始终使它们相同   要么大幅度降低速度,要么有意降低精度。

所以这就是区别的所在,您不应期望获得相同的结果,但应获得容忍的相同结果。因此比较它们的最简单方法是 Divakar 建议的方法:

np.allclose(l,v)

另一个可能的选择是:

np.array_equal(np.round(l,12),np.round(v,12))