我正在尝试使用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
您可以阅读以下issue。
据说那里:
numpy通常不保证在语义上等效这样的操作将产生相同的结果。均匀作业像sum可以产生不同的结果,具体取决于内存布局(和这是故意的-始终使它们相同大幅降低速度或故意降低精度)。
所以这就是区别所在,您不应期望得到相同的结果,但要达到容忍的相同结果。因此比较它们的最简单方法是Divakar:
建议的方法np.allclose(l,v)
另一个可能的选择是:
np.array_equal(np.round(l,12),np.round(v,12))