On Thu, Jul 14, 2011 at 15:43, Benjamin Root <[email protected]> wrote: > I just came across a real-head scratcher that took me a bit to figure out. I > don't know if it counts as a bug or not. > > I have an array with dtype "f4" and a separate python float. Some elements > of this array gets assigned this numpy float64 scalar value. (I know, I > should be better off with a mask, but bear with me, this is just a > demonstration code to isolate the core problem from a much more complicated > program...) > > import numpy as np > > a = np.empty((500,500), dtype='f4') > a[:] = np.random.random(a.shape) > bad_val = 10*a.max() > > b = np.where(a > 0.8, bad_val, a) > > Now, the following seems to always evaluate to False, as expected: > >>>> np.any(b > bad_val) > > but, if I am (un-)lucky enough, this will sometimes evaluate to True: > >>>> any([(c > bad_val) for c in b.flat]) > > What it seems to me is that for the first comparison test, bad_val is casted > down to float32 (or maybe b is casted up to float64?), but for the second > example, the opposite is true. This can lead to some unexpected behaviors. > Is there some sort of difference between type-casting of numpy scalars and > numpy arrays? I would expect both to be the same.
Remember, the rule for ufuncs is that when the operation is array-scalar, the array dtype wins (barring cross-kind types which aren't relevant here). For array-array and scalar-scalar, the "largest" dtype wins. So for the first case, array-scalar, bad_val gets downcasted to float32. For the latter case, bad_val remains float64 and upcasts c to float64. Try this: bad_val = np.float32(10) * a.max() -- 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 _______________________________________________ NumPy-Discussion mailing list [email protected] http://mail.scipy.org/mailman/listinfo/numpy-discussion
