[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