<div dir="ltr"><div><div><div><div><div><div><div><div>Still slower and worse uses 2x the memory for the intermediate temporary array.<br><br></div>I propose allowing implicit reductions with ufuncs.  Specifically if out is provided with shape[axis] = 1, then pass it on to the ufunc with a stride of 0.  That should allow this to work:<br><br>x = np.arange(10)<br>def add_square_diff(x1, x2, x3):<br>    return x1 + (x2-x3)**2<br></div></div>result  =np.zeros(1)<br></div>np.frompyfunc(add_square_diff, 3, 1)(result, x, np.mean(x), result)<br><br></div>Essentially it creates a reduce for a function which isn't binary.  I think this would be generally useful.  For instance, finding the min and max in one pass would be nice:<br><br>def minmax(x1, x2, x3):<br>    return min(x1,x3), max(x2,x3)<br></div>minn = np.array([np.inf])<br>maxx = np.array([-np.inf])<br></div>np.frompyfunc(minmax, 3, 2)(minn, maxx, x, minn, maxx)<br><br></div>Note it also allows for arbitrary initial values or identity to be specified, possibly determined at run time.  I think this would make ufuncs even more universal.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 14, 2016 at 3:38 AM, Jerome Kieffer <span dir="ltr"><<a href="mailto:Jerome.Kieffer@esrf.fr" target="_blank">Jerome.Kieffer@esrf.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Fri, 11 Nov 2016 11:25:58 -0500<br>
Matthew Harrigan <<a href="mailto:harrigan.matthew@gmail.com">harrigan.matthew@gmail.com</a>> wrote:<br>
<br>
> I started a ufunc to compute the sum of square differences here<br>
</span>> <<a href="https://gist.github.com/mattharrigan/6f678b3d6df5efd236fc23bfb59fd3bd" rel="noreferrer" target="_blank">https://gist.github.com/<wbr>mattharrigan/<wbr>6f678b3d6df5efd236fc23bfb59fd3<wbr>bd</a>>.<br>
<span class="">> It is about 4x faster and uses half the memory compared to<br>
> np.sum(np.square(x-c)).<br>
<br>
</span>Hi Matt,<br>
<br>
Using *blas* you win already a factor two (maybe more depending on you blas implementation):<br>
<br>
% python -m timeit -s "import numpy as np;x=np.linspace(0,1,int(1e7))<wbr>" "np.sum(np.square(x-2.))"<br>
10 loops, best of 3: 135 msec per loop<br>
<br>
% python -m timeit -s "import numpy as np;x=np.linspace(0,1,int(1e7))<wbr>" "y=x-2.;np.dot(y,y)"<br>
10 loops, best of 3: 70.2 msec per loop<br>
<br>
<br>
Cheers,<br>
<span class="HOEnZb"><font color="#888888">--<br>
Jérôme Kieffer<br>
</font></span><div class="HOEnZb"><div class="h5">______________________________<wbr>_________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="https://mail.scipy.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.scipy.org/<wbr>mailman/listinfo/numpy-<wbr>discussion</a><br>
</div></div></blockquote></div><br></div>