为什么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)
仍然,试图了解到底发生了什么。
答案 0 :(得分:-1)
由于浮点数的工作方式,它们并不相同。参见例如The Floating-Point Guide on comparing floating point numbers。这就是numpy提供allclose
方法的原因。
如果将数组的类型更改为整数(例如dtype=np.int32
),则数组将相等。
答案 1 :(得分:-2)
当将==应用于numpy数组时,它将数组中的每个元素与要比较的元素进行比较。因此,在这种情况下,您需要将数组中的每个元素都检查到一个数组中。