2010/7/29 Keith Goodman <kwgood...@gmail.com>: > On Wed, Jul 28, 2010 at 6:42 PM, Matthew Brett <matthew.br...@gmail.com> > wrote: >> Hi, >> >> Please forgive me if this is obvious, but this surprised me: >> >> In [15]: x = np.array(['a', 'b']) >> >> In [16]: x == 'a' # this was what I expected >> Out[16]: array([ True, False], dtype=bool) >> >> In [17]: x == 1 # this was strange to me >> Out[17]: False > > Here's a related case: > >>> np.array(['a', 'b']) == np.array([1, 2]) > False
Yeah, it's just that numpy knows that it cannot compare pears with apples: >>> a = numpy.asarray(['a', 'b']) >>> a.__eq__(1) NotImplemented so Python falls back to the Python string's or int's __eq__, which does not know of the structure of numpy, and returns simply False. In case of the numpy.object array, it's of course forwarded to the constituents, resulting in the "correct wrong" result (correct because it's Python-correct, wrong because it's comparing strings to ints). About Keith's case: >>> b = numpy.asarray([1, 2]) >>> a.__eq__(b) NotImplemented >>> b.__eq__(a) NotImplemented So Python falls back to comparing the IDs id(a) == id(b), which also results in False. Maybe it would be better to raise a ValueError, which is not caught by the evaluation mechanism, to prevent such stuff. Friedrich _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion