[Numpy-discussion] strange behavior with a numpy array as member of a list

Robert Kern robert.kern at gmail.com
Thu Nov 30 15:12:01 CST 2006


Tim Hirzel wrote:
> Thanks Robert.
> That makes more sense now.  Although I am still a little puzzled by the 
> equality behavior of an array.  for example:
> 
>  >>> a = numpy.arange(5)
>  >>> None == a
> False
> 
>  >>> 5 == a
> array([False, False, False, False, False], dtype=bool)
> 
>  >>> class Empty:
>     pass
>  >>> e = Empty()
>  >>> e == a
> array([False, False, False, False, False], dtype=bool)
> 
>  >>> L = []
>  >>> L == a
> False
> 
> #this behavior seems consistent regardless of the dtype of the array:
>  >>> b = numpy.array([None, 5])
>  >>> b
> array([None, 5], dtype=object)
>  >>> b  == 4
> array([False, False], dtype=bool)
> 
> What determines if an array tests for equality as the entire array or 
> element-wise?

There are some special cases for backwards compatibility. They are covered in
this portion of arrayobject.c in the function array_richcompare():

                case Py_EQ:
                        if (other == Py_None) {
                                Py_INCREF(Py_False);
                                return Py_False;
                        }
                        /* Try to convert other to an array */
                        if (!PyArray_Check(other)) {
                                typenum = self->descr->type_num;
                                if (typenum != PyArray_OBJECT) {
                                        typenum = PyArray_NOTYPE;
                                }
                                array_other = PyArray_FromObject(other,
                                                                 typenum, 0, 0);
                                /* If not successful, then return False
                                   This fixes code that used to
                                   allow equality comparisons between arrays
                                   and other objects which would give a result
                                   of False
                                */
                                if ((array_other == NULL) ||    \
                                    (array_other == Py_None)) {
                                        Py_XDECREF(array_other);
                                        PyErr_Clear();
                                        Py_INCREF(Py_False);
                                        return Py_False;
                                }
                        }

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
 that is made terrible by our own mad attempt to interpret it as though it had
 an underlying truth."
  -- Umberto Eco


More information about the Numpy-discussion mailing list