numpy矩阵看起来不一样,但不相等

时间:2018-06-28 07:05:58

标签: python numpy precision equality

为什么numpy数组中的元素彼此不相等?

这是我的环境:

jupyter QtConsole 4.3.1
Python 2.7.13 |Anaconda custom (x86_64)| (default, Dec 20 2016, 23:05:08) 
Type "copyright", "credits" or "license" for more information.

IPython 5.3.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

import sys
print(sys.version)
print np.__version__
2.7.13 |Anaconda custom (x86_64)| (default, Dec 20 2016, 23:05:08) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
1.12.1

这是我得到两个数组的方式:

A = np.array([[2., 3.],
              [10., 1.]])
rprime = np.array([[8.], [13.]])
A_inv = np.linalg.inv(A)
r = np.dot(A_inv, rprime)

如您所见,它们看起来相同:

np.dot(A, r)
Out[72]: 
array([[  8.],
       [ 13.]])

rprime
Out[73]: 
array([[  8.],
       [ 13.]])

但是当我比较它们时,它们不是:

np.dot(A, r) == rprime
Out[74]: 
array([[False],
       [False]], dtype=bool)

形状和类型都相同:

print type(np.dot(A, r))
print type(rprime)
print type(np.dot(A, r)[0, 0])
print type(rprime[0, 0])
print type(np.dot(A, r)[1, 0])
print type(rprime[1, 0])
print np.dot(A, r).shape
print rprime.shape


<type 'numpy.ndarray'>
<type 'numpy.ndarray'>
<type 'numpy.float64'>
<type 'numpy.float64'>
<type 'numpy.float64'>
<type 'numpy.float64'>
(2, 1)
(2, 1)

当我使用allclose时,我会成真:

np.allclose(np.dot(A, r), rprime)
Out[76]: True

我想了解的是为什么它们不被视为相同?

添加: 它必须与存储在矩阵中的确切浮点数有关:

np.round(np.dot(A, r),0) == np.round(rprime,0)
Out[81]: 
array([[ True],
       [ True]], dtype=bool)

仍然,试图了解到底发生了什么。

2 个答案:

答案 0 :(得分:-1)

由于浮点数的工作方式,它们并不相同。参见例如The Floating-Point Guide on comparing floating point numbers。这就是numpy提供allclose方法的原因。

如果将数组的类型更改为整数(例如dtype=np.int32),则数组将相等。

答案 1 :(得分:-2)

当将==应用于numpy数组时,它将数组中的每个元素与要比较的元素进行比较。因此,在这种情况下,您需要将数组中的每个元素都检查到一个数组中。