[Numpy-discussion] dtype promotion
Hi all, I'm using numpy 1.8.0 (osx 10.9, python 2.7.6) and I can't understand dtype promotion in the following case: Z = np.zeros((2,2),dtype=np.float32) + 1 print Z.dtype float32 Z = np.zeros((2,2),dtype=np.float32) + (1,1) print Z.dtype float64 Is this the expected behavior ? What it the difference between the two lines ? Nicolas ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] dtype promotion
On Mon, 2014-03-03 at 22:06 +0100, Nicolas Rougier wrote: Hi all, I'm using numpy 1.8.0 (osx 10.9, python 2.7.6) and I can't understand dtype promotion in the following case: Z = np.zeros((2,2),dtype=np.float32) + 1 print Z.dtype float32 Z = np.zeros((2,2),dtype=np.float32) + (1,1) print Z.dtype float64 Is this the expected behavior ? What it the difference between the two lines ? It is intended I guess, scalars (including 0-d arrays such `np.array(1)`) behave differently form normal arrays. Their type is not as important and in many cases with integers even the value gets important. I did not think through this exact case, and there are some funnier corners which have been discussed a lot, but basically you have to expect different casting when scalars are involved (don't trust the scalar dtype to win). (Of course in this context, you always have to imagin an `np.asarray` call) - Sebastian Nicolas ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] dtype promotion
The tuple gets cast to an ndarray; which invokes a different codepath than the scalar addition. Somehow, numpy has gotten more aggressive at upcasting to float64 as of 1.8, but I havnt been able to discover the logic behind it either. On Mon, Mar 3, 2014 at 10:06 PM, Nicolas Rougier nicolas.roug...@inria.frwrote: Hi all, I'm using numpy 1.8.0 (osx 10.9, python 2.7.6) and I can't understand dtype promotion in the following case: Z = np.zeros((2,2),dtype=np.float32) + 1 print Z.dtype float32 Z = np.zeros((2,2),dtype=np.float32) + (1,1) print Z.dtype float64 Is this the expected behavior ? What it the difference between the two lines ? Nicolas ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] dtype promotion
On Mon, 2014-03-03 at 22:26 +0100, Eelco Hoogendoorn wrote: The tuple gets cast to an ndarray; which invokes a different codepath than the scalar addition. Somehow, numpy has gotten more aggressive at upcasting to float64 as of 1.8, but I havnt been able to discover the logic behind it either There were changes in the casting logic in 1.7, I think. I can't really remember changes after that, so if there is a change, we might want to check it out. (Or I am just missing something completly :)) - Sebastian On Mon, Mar 3, 2014 at 10:06 PM, Nicolas Rougier nicolas.roug...@inria.fr wrote: Hi all, I'm using numpy 1.8.0 (osx 10.9, python 2.7.6) and I can't understand dtype promotion in the following case: Z = np.zeros((2,2),dtype=np.float32) + 1 print Z.dtype float32 Z = np.zeros((2,2),dtype=np.float32) + (1,1) print Z.dtype float64 Is this the expected behavior ? What it the difference between the two lines ? Nicolas ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] dtype promotion
IIRC, this is dependent on whether you are using 32bit versus 64bit numpy. All regular integer numbers can fit in 32 bits (is that right?), but the 1.1 is treated as a float32 if on a 32 bit NumPy or as float64 if on a 64 bit NumPy. That's my stab at it. Ben Root On Mon, Mar 3, 2014 at 4:06 PM, Nicolas Rougier nicolas.roug...@inria.frwrote: Hi all, I'm using numpy 1.8.0 (osx 10.9, python 2.7.6) and I can't understand dtype promotion in the following case: Z = np.zeros((2,2),dtype=np.float32) + 1 print Z.dtype float32 Z = np.zeros((2,2),dtype=np.float32) + (1,1) print Z.dtype float64 Is this the expected behavior ? What it the difference between the two lines ? Nicolas ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] dtype promotion
I never noticed this kind of cast before (1.8.0), it's just a bit surprising. It was convenient to write translations (for a bunch of points) such as: Z = np.ones((n,2),dtype=np.float32) + (300,300) but I can live with Z += 300,300 Nicolas On 03 Mar 2014, at 23:02, Benjamin Root ben.r...@ou.edu wrote: IIRC, this is dependent on whether you are using 32bit versus 64bit numpy. All regular integer numbers can fit in 32 bits (is that right?), but the 1.1 is treated as a float32 if on a 32 bit NumPy or as float64 if on a 64 bit NumPy. That's my stab at it. Ben Root On Mon, Mar 3, 2014 at 4:06 PM, Nicolas Rougier nicolas.roug...@inria.fr wrote: Hi all, I'm using numpy 1.8.0 (osx 10.9, python 2.7.6) and I can't understand dtype promotion in the following case: Z = np.zeros((2,2),dtype=np.float32) + 1 print Z.dtype float32 Z = np.zeros((2,2),dtype=np.float32) + (1,1) print Z.dtype float64 Is this the expected behavior ? What it the difference between the two lines ? Nicolas ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] dtype promotion
Oops, I just now noticed that it was (1,1) and not (1.1). I really need to set a better font that makes the period and the comma more different... Ben Root On Mon, Mar 3, 2014 at 5:12 PM, Nicolas Rougier nicolas.roug...@inria.frwrote: I never noticed this kind of cast before (1.8.0), it's just a bit surprising. It was convenient to write translations (for a bunch of points) such as: Z = np.ones((n,2),dtype=np.float32) + (300,300) but I can live with Z += 300,300 Nicolas On 03 Mar 2014, at 23:02, Benjamin Root ben.r...@ou.edu wrote: IIRC, this is dependent on whether you are using 32bit versus 64bit numpy. All regular integer numbers can fit in 32 bits (is that right?), but the 1.1 is treated as a float32 if on a 32 bit NumPy or as float64 if on a 64 bit NumPy. That's my stab at it. Ben Root On Mon, Mar 3, 2014 at 4:06 PM, Nicolas Rougier nicolas.roug...@inria.fr wrote: Hi all, I'm using numpy 1.8.0 (osx 10.9, python 2.7.6) and I can't understand dtype promotion in the following case: Z = np.zeros((2,2),dtype=np.float32) + 1 print Z.dtype float32 Z = np.zeros((2,2),dtype=np.float32) + (1,1) print Z.dtype float64 Is this the expected behavior ? What it the difference between the two lines ? Nicolas ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] dtype promotion
On Mon, 2014-03-03 at 23:12 +0100, Nicolas Rougier wrote: I never noticed this kind of cast before (1.8.0), it's just a bit surprising. It was convenient to write translations (for a bunch of points) such as: Z = np.ones((n,2),dtype=np.float32) + (300,300) but I can live with Z += 300,300 Just to note. That actually does the temporary cast anyway doing the calculation in double precision and then casting the result. If you want to make sure it stays in single precision you will need to make that an array with float32 dtype. - Sebastian Nicolas On 03 Mar 2014, at 23:02, Benjamin Root ben.r...@ou.edu wrote: IIRC, this is dependent on whether you are using 32bit versus 64bit numpy. All regular integer numbers can fit in 32 bits (is that right?), but the 1.1 is treated as a float32 if on a 32 bit NumPy or as float64 if on a 64 bit NumPy. That's my stab at it. Ben Root On Mon, Mar 3, 2014 at 4:06 PM, Nicolas Rougier nicolas.roug...@inria.fr wrote: Hi all, I'm using numpy 1.8.0 (osx 10.9, python 2.7.6) and I can't understand dtype promotion in the following case: Z = np.zeros((2,2),dtype=np.float32) + 1 print Z.dtype float32 Z = np.zeros((2,2),dtype=np.float32) + (1,1) print Z.dtype float64 Is this the expected behavior ? What it the difference between the two lines ? Nicolas ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion