On Wed, Apr 27, 2011 at 8:42 PM, Robert Kern <robert.k...@gmail.com> wrote: > On 2011-04-27 22:16 , Guido van Rossum wrote: >> So does NumPy also follow Python's behavior about ignoring the NaN >> special-casing when doing array ops? > > By "ignoring the NaN special-casing", do you mean that identity is checked > first? When we use dtype=object arrays (arrays that contain Python objects > as their data), yes: > > [~] > |1> nan = float('nan') > > [~] > |2> import numpy as np > > [~] > |3> a = np.array([1, 2, nan], dtype=object) > > [~] > |4> nan in a > True > > [~] > |5> float('nan') in a > False > > > Just like lists: > > [~] > |6> nan in [1, 2, nan] > True > > [~] > |7> float('nan') in [1, 2, nan] > False > > > Actually, we go a little further by using PyObject_RichCompareBool() rather > than PyObject_RichCompare() to implement the array-wise comparisons in > addition to containment: > > [~] > |8> a == nan > array([False, False, True], dtype=bool)
Hm, this sounds like NumPy always considers a NaN equal to *itself* as long as objects are concerned. > [~] > |9> [x == nan for x in [1, 2, nan]] > [False, False, False] > > > But for dtype=float arrays (which contain C doubles, not Python objects) we > use C semantics. Literally, we use whatever C's == operator gives us for the > two double values. Since there is no concept of identity for this case, > there is no cognate behavior of Python to match. > > [~] > |10> b = np.array([1.0, 2.0, nan], dtype=float) > > [~] > |11> b == nan > array([False, False, False], dtype=bool) > > [~] > |12> nan in b > False And I wouldn't want to change that. It sounds like NumPy wouldn't be much affected if we were to change this (which I'm not saying we would). Thanks! -- --Guido van Rossum (python.org/~guido) _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com