<div class="gmail_quote">On Thu, Mar 31, 2011 at 10:00 AM, Ralf Gommers <span dir="ltr">&lt;<a href="mailto:ralf.gommers@googlemail.com">ralf.gommers@googlemail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div><div></div><div class="h5">On Wed, Mar 30, 2011 at 11:52 PM, Derek Homeier<br>
&lt;<a href="mailto:derek@astro.physik.uni-goettingen.de">derek@astro.physik.uni-goettingen.de</a>&gt; wrote:<br>
&gt;<br>
&gt; On 30 Mar 2011, at 23:26, Benjamin Root wrote:<br>
&gt;<br>
&gt;&gt; Ticket 301: &#39;Make power and divide return floats from int inputs (like<br>
&gt;&gt; true_divide)&#39;<br>
&gt;&gt; <a href="http://projects.scipy.org/numpy/ticket/301" target="_blank">http://projects.scipy.org/numpy/ticket/301</a><br>
&gt;&gt; Invalid because the output dtype is the same as the input dtype unless<br>
&gt;&gt; you override using the dtype argument:<br>
&gt;&gt;  &gt;&gt;&gt; np.power(3, 1, dtype=np.float128).dtype<br>
&gt;&gt; dtype(&#39;float128&#39;)<br>
&gt;&gt; Alternatively return a float and indicate in the docstring that the<br>
&gt;&gt; output dtype can be changed.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; FWIW,<br>
&gt;&gt;<br>
&gt;&gt; Just thought I&#39;d note (on a python 2.6 system):<br>
&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; import numpy as np<br>
&gt;&gt; &gt;&gt;&gt; a = np.array([1, 2, 3, 4])<br>
&gt;&gt; &gt;&gt;&gt; a.dtype<br>
&gt;&gt; dtype(&#39;int32&#39;)<br>
&gt;&gt; &gt;&gt;&gt; 2 / a<br>
&gt;&gt; array([2, 1, 0, 0])<br>
&gt;&gt; &gt;&gt;&gt; from __future__ import division<br>
&gt;&gt; &gt;&gt;&gt; 2 / a<br>
&gt;&gt; array([ 2.        ,  1.        ,  0.66666667,  0.5       ])<br>
&gt;&gt;<br>
&gt;&gt; So, numpy already does this when true division is imported (and<br>
&gt;&gt; therefore consistent with whatever the python environment does), and<br>
&gt;&gt; python currently also returns integers for exponentials when both<br>
&gt;&gt; inputs are integers.<br>
&gt;<br>
&gt; I&#39;d agree, and in my view power(3, -1) is well defined as 1 / 3 -<br>
&gt; also, in future (or Python3)<br>
&gt;<br>
&gt;  &gt;&gt;&gt; a/2<br>
&gt; array([ 0.5,  1. ,  1.5,  2. ])<br>
&gt;  &gt;&gt;&gt; a//2<br>
&gt; array([0, 1, 1, 2], dtype=int32)<br>
<br>
</div></div>The ticket is about the functions np.divide and np.power, not / and<br>
**. This currently does not work the same, unlike what&#39;s said above:<br>
<br>
&gt;&gt;&gt; from __future__ import division<br>
&gt;&gt;&gt; x = np.arange(4) + 1<br>
<div class="im">&gt;&gt;&gt; 2 / x<br>
array([ 2.        ,  1.        ,  0.66666667,  0.5       ])<br>
</div>&gt;&gt;&gt; np.divide(2, x)<br>
<div class="im">array([2, 1, 0, 0])<br>
<br>
</div>The power and divide functions should not check the &quot;from __future__<br>
import division&quot;, just return floats IMHO. This is what&#39;s expected by<br>
most users, and much more useful than integer math.<br>
<div class="im"><br></div></blockquote><div><br>Hmm, I didn&#39;t notice that distinction.  So long as there is a consistent difference between the function and the operator, I am fine with that.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div class="im">
<br>
&gt; so I think at least a**n should follow integer math rules; depends on<br>
&gt; whether we want<br>
&gt; np.power to behave differently from ** (if they are internally handled<br>
&gt; separately at all)...<br>
&gt; Not sure if I understand the overload suggestion in the ticket<br>
<br>
</div>I don&#39;t understand that either, it&#39;ll just lead to more confusion.<br>
<br></blockquote><div><br>Did a little further investigation of this (I hadn&#39;t thought of negative powers), and now I am getting thoroughly confused...<br><br>&gt;&gt;&gt; import numpy as np<br>&gt;&gt;&gt; a = np.array([1, 2])<br>

&gt;&gt;&gt; a.dtype<br>dtype(&#39;int32&#39;)<br>&gt;&gt;&gt; 1**2<br>1<br>&gt;&gt;&gt; 2**2<br>4<br>&gt;&gt;&gt; 1**-2<br>1.0<br>&gt;&gt;&gt; 2**-2<br>0.25<br>&gt;&gt;&gt; a**2<br>array([1, 4])<br>&gt;&gt;&gt; a**-2<br>

array([1, 0])<br>&gt;&gt;&gt; np.power(a, 2)<br>array([1, 4])<br>&gt;&gt;&gt; np.power(a, -2)<br>array([1, 0])<br><br>So, in this case, the ** operator and np.power are identical, but diverges from the behavior of python&#39;s operator.<br>

<br>FWIW,<br>Ben Root<br><br></div></div>