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

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

我正在尝试使用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

python numpy
1个回答
0
投票

您可以阅读以下issue

据说那里:

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

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

建议的方法
np.allclose(l,v)

另一个可能的选择是:

np.array_equal(np.round(l,12),np.round(v,12))
© www.soinside.com 2019 - 2024. All rights reserved.