比较矩阵与nans时numpy.isclose中可能存在的错误

时间:2017-10-17 12:57:47

标签: numpy matrix nan

考虑下一段代码:

In [90]: m1 = np.matrix([1,2,3], dtype=np.float32)

In [91]: m2 = np.matrix([1,2,3], dtype=np.float32)

In [92]: m3 = np.matrix([1,2,'nan'], dtype=np.float32)

In [93]: np.isclose(m1, m2, equal_nan=True)
Out[93]: matrix([[ True,  True,  True]], dtype=bool)

In [94]: np.isclose(m1, m3, equal_nan=True)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-94-5d2b979bc263> in <module>()
----> 1 np.isclose(m1, m3, equal_nan=True)

/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.pyc in isclose(a, b, rtol, atol, equal_nan)
   2571         # Ideally, we'd just do x, y = broadcast_arrays(x, y). It's in
   2572         # lib.stride_tricks, though, so we can't import it here.
-> 2573         x = x * ones_like(cond)
   2574         y = y * ones_like(cond)
   2575         # Avoid subtraction with infinite/nan values...

/usr/local/lib/python2.7/dist-packages/numpy/matrixlib/defmatrix.pyc in __mul__(self, other)
    341         if isinstance(other, (N.ndarray, list, tuple)) :
    342             # This promotes 1-D vectors to row vectors
--> 343             return N.dot(self, asmatrix(other))
    344         if isscalar(other) or not hasattr(other, '__rmul__') :
    345             return N.dot(self, other)

ValueError: shapes (1,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)

将数组与nans进行比较时,它按预期工作:

In [95]: np.isclose(np.array(m1), np.array(m3), equal_nan=True)
Out[95]: array([[ True,  True, False]], dtype=bool)

为什么np.isclose失败了?从文档中看来它应该可行

感谢

1 个答案:

答案 0 :(得分:1)

问题来自np.nan == np.nan,它在浮动逻辑中是False

In [39]: np.nan == np.nan
Out[39]: False

The `equal_nan` parameter is to force two `nan` values to be considered as equal , not to consider any value to be equal to `nan`.

In [37]: np.isclose(m3,m3)
Out[37]: array([ True,  True, False], dtype=bool)

In [38]: np.isclose(m3,m3,equal_nan=True)
Out[38]: array([ True,  True,  True], dtype=bool)