我正在尝试使用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)
但是,当我检查l
与v
与np.all(l == v)
是否相等时,它将为我输出False
。我不明白为什么numpy会这样表现。我检查了v
和l
的值的dtype,它们都是np.float64
答案 0 :(得分:1)
您可以阅读以下issue。
据说在那里:
numpy通常不保证在语义上等效 这样的操作将产生相同的结果。均匀作业 像sum可以产生不同的结果,具体取决于内存布局(和 这是故意的-始终使它们相同 要么大幅度降低速度,要么有意降低精度。
所以这就是区别的所在,您不应期望获得相同的结果,但应获得容忍的相同结果。因此比较它们的最简单方法是 Divakar 建议的方法:
np.allclose(l,v)
另一个可能的选择是:
np.array_equal(np.round(l,12),np.round(v,12))