<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Apr 11, 2010, at 2:56 PM, Anne Archibald wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>2010/4/10 Stéfan van der Walt &lt;<a href="mailto:stefan@sun.ac.za">stefan@sun.ac.za</a>&gt;:<br><blockquote type="cite">On 10 April 2010 19:45, Pauli Virtanen &lt;<a href="mailto:pav@iki.fi">pav@iki.fi</a>&gt; wrote:<br></blockquote><blockquote type="cite"><blockquote type="cite">Another addition to ufuncs that should be though about is specifying the<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Python-side interface to generalized ufuncs.<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">This is an interesting idea; what do you have in mind?<br></blockquote><br>I can see two different kinds of answer to this question: one is a<br>tool like vectorize/frompyfunc that allows construction of generalized<br>ufuncs from python functions, and the other is thinking out what<br>methods and support functions generalized ufuncs need.<br><br>The former would be very handy for prototyping gufunc-based libraries<br>before delving into the templated C required to make them actually<br>efficient.<br><br>The latter is more essential in the long run: it'd be nice to have a<br>reduce-like function, but obviously only when the arity and dimensions<br>work out right (which I think means (shape1,shape2)-&gt;(shape2) ). This<br>could be applied along an axis or over a whole array. reduceat and the<br>other, more sophisticated, schemes might also be worth supporting. At<br>a more elementary level, gufunc objects should have good introspection<br>- docstrings, shape specification accessible from python, named formal<br>arguments, et cetera. (So should ufuncs, for that matter.)<br></div></blockquote><div><br></div>We should collect all of these proposals into a NEP. &nbsp; &nbsp; &nbsp;To clarify what I mean by "group-by" behavior.&nbsp;</div><div><br></div><div>Suppose I have an array of floats and an array of integers. &nbsp; Each element in the array of integers represents a region in the float array of a certain "kind". &nbsp; The reduction should take place over like-kind values:&nbsp;</div><div><br></div><div>Example:&nbsp;</div><div><br></div><div>add.reduceby(array=[1,2,3,4,5,6,7,8,9], by=[0,1,0,1,2,0,0,2,2])</div><div><br></div><div>results in the calculations:&nbsp;</div><div><br></div><div>1 + 3 + 6 + 7</div><div>2 + 4</div><div>5 + 8 + 9</div><div><br></div><div>and therefore the output (notice the two arrays --- perhaps a structured array should be returned instead...)</div><div><br></div><div>[0,1,2],&nbsp;</div><div>[17, 6, 22]</div><div><br></div><div><br></div><div>The real value is when you have tabular data and you want to do reductions in one field based on values in another field. &nbsp; This happens all the time in relational algebra and would be a relatively straightforward thing to support in ufuncs.&nbsp;</div><div><br></div><div>-Travis</div><div><br></div><div><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 12px;"><span class="Apple-style-span" style="font-size: medium;"><br></span></span></font></div><div apple-content-edited="true"><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br class="Apple-interchange-newline"></div></span><br class="Apple-interchange-newline"></div></span><br class="Apple-interchange-newline"> </div><br></body></html>