为什么numpy以不同的方式规范化这些等效数组?

时间:2018-03-15 04:24:47

标签: python arrays numpy precision normalize

两个数组raw_document_scoresraw_doc_scores1 are equal,由raw_document_scores==raw_doc_scores1证明返回所有真实数组。但是,当我检查是否

raw_document_scores/np.linalg.norm(raw_document_scores, 1, axis=1).reshape(-1,1) \
== raw_doc_scores1/np.linalg.norm(raw_doc_scores1, 1, axis=1).reshape(-1,1)

我对某些条目有误。我减去了两个数组以查看每个条目的差异,并且它小于e-18,所以它们大致相等。但是,如果输入数组完全相等,为什么它们不完全相等?前两个数组实际上是不相等的吗?当python / numpy表示所有条目都相等时,它们是否在说谎?这是一张显示发生的事情的图片。

difference

1 个答案:

答案 0 :(得分:1)

由于您没有提供有关输入数据的任何详细信息,唯一的方法是给出答案是猜测实际上哪些是错误的。这是一个与你相匹配的场景;在64位Python上生成:

>>> A = np.array(np.random.random([10, 3])*10, dtype=int)
>>> B = np.array(A, dtype='float32')
>>> A == B
array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]])

>>> np.linalg.norm(A, axis=1) == np.linalg.norm(B, axis=1)
array([False, False, False, False, False, False, False,  True, False,
       False])

我猜这是raw_document_scoresraw_doc_scores1之间不匹配的数据类型。供参考:

>>> C = np.copy(A)
>>> np.linalg.norm(A, axis=1) == np.linalg.norm(C, axis=1)
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True])