I didn't notice identity before. Seems like frompyfunc always sets it to None. If it were zero maybe it would work as desired here.
In the writing your own ufunc doc, I was wondering if the pointer to data could be used to get a constant at runtime. If not, what could that be used for? static void double_logit(char **args, npy_intp *dimensions, npy_intp* steps, void* data) Why would the numerical accuracy be any different? The subtraction and square operations look identical and I thought np.sum just calls np.add.reduce, so the reduction step uses the same code and would therefore have the same accuracy. Thanks On Fri, Nov 4, 2016 at 1:56 PM, Sebastian Berg <sebast...@sipsolutions.net> wrote: > On Fr, 2016-11-04 at 13:11 -0400, Matthew Harrigan wrote: > > I was reading this and got thinking about if a ufunc could compute > > the sum of squared differences in a single pass without a temporary > > array. The python code below demonstrates a possible approach. > > > > import numpy as np > > x = np.arange(10) > > c = 1.0 > > def add_square_diff(x1, x2): > > return x1 + (x2-c)**2 > > ufunc = np.frompyfunc(add_square_diff, 2, 1) > > print(ufunc.reduce(x) - x[0] + (x[0]-c)**2) > > print(np.sum(np.square(x-c))) > > > > I have (at least) 4 questions: > > 1. Is it possible to pass run time constants to a ufunc written in C > > for use in its inner loop, and if so how? > > I don't think its anticipated, since a ufunc could in most cases use a > third argument, but a 3 arg ufunc can't be reduced. Not sure if there > might be some trickery possible. > > > 2. Is it possible to pass an initial value to reduce to avoid the > > clean up required for the first element? > > This is the identity normally. But the identity can only be 0, 1 or -1 > right now I think. The identity is what the output array gets > initialized with (which effectively makes it the first value passed > into the inner loop). > > > 3. Does that ufunc work, or are there special cases which cause it to > > fall apart? > > 4. Would a very specialized ufunc such as this be considered for > > incorporating in numpy since it would help reduce time and memory of > > functions already in numpy? > > > > Might be mixing up things, however, IIRC the single pass approach has a > bad numerical accuracy, so that I doubt that it is a good default > algorithm. > > - Sebastian > > > > Thank you, > > Matt > > _______________________________________________ > > NumPy-Discussion mailing list > > NumPy-Discussion@scipy.org > > https://mail.scipy.org/mailman/listinfo/numpy-discussion > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@scipy.org > https://mail.scipy.org/mailman/listinfo/numpy-discussion > >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org https://mail.scipy.org/mailman/listinfo/numpy-discussion