2017-10-17 12 views
1

considèrent le prochain morceau de code:un bug possible dans numpy.isclose lorsque l'on compare les matrices avec nans

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) 

lorsque l'on compare les tableaux avec nans il fonctionne comme prévu:

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

pourquoi est-np. isclose échoue? de la documentation, il semble que cela devrait fonctionner

grâce

+0

Le type de matrice est le coupable (fonctionne pour les tableaux). Je ne sais pas comment interpréter les docs sur ce type en entrée! – sascha

Répondre

1

Le problème vient de np.nan == np.nan, qui est False dans la logique du flotteur.

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) 
+0

quelle version np utilisez-vous? pour moi la ligne np.isclose (m3, m3) se traduit par ValueError: les formes (1,3) et (1,3) ne sont pas alignées: 3 (dim 1)! = 1 (dim 0) – user2717954

+1

Désolé. Je ne te vois pas travailler avec des matrices. Comme dit dans le commentaire, le problème est que isclose n'accepte que ndarrays. La matrice est une structure quasi déconseillée. –