Warren, The examples in ufunclab helped clear up a few things and I was able to experiment and get a working gufunc! Thank you for your help!
Ben Root On Fri, Jun 27, 2025 at 8:54 PM Benjamin Root <ben.v.r...@gmail.com> wrote: > Warren, > > I'm fine with implementing it in C. I just didn't think gufuncs were for > me. I couldn't tell from the description if it would be for my usecase > since I wasn't looping over subarrays, and I didn't see any good examples. > Maybe the documentation could be clearer. I'll have a look at your examples. > > I did try that signature with np.vectorize() with the signature keyword > argument, but it didn't seem to work. Maybe it didn't work for the reasons > in that open issue. > > Thank you, > Ben Root > > On Fri, Jun 27, 2025 at 8:03 PM Warren Weckesser via NumPy-Discussion < > numpy-discussion@python.org> wrote: > >> On Fri, Jun 27, 2025 at 5:29 PM Benjamin Root via NumPy-Discussion >> <numpy-discussion@python.org> wrote: >> > >> > I'm looking at a situation where I like to wrap a C++ function that >> takes two doubles as inputs, and returns an error code, a position vector, >> and a velocity vector so that I essentially would have a function signature >> of (N), (N) -> (N), (N, 3), (N, 3). When I try to use np.vectorize() or >> np.frompyfunc() on the python version of this function, I keep running into >> issues where it wants to make the outputs into object arrays of tuples. And >> looking at utilizing PyUFunc_FromFuncAndData, it isn't clear to me how I >> can tell it to expect those two output arrays to have a size 3 outer >> dimension. >> > >> > Are ufuncs the wrong thing here? How should I go about this? Is it even >> possible? >> >> Ben, >> >> It looks like the simplest signature for your core operation would be >> (),()->(),(3),(3), with broadcasting taking care of higher dimensional >> inputs. Because not all the core shapes are scalars, that would >> require a *generalized* ufunc (gufunc). There is an open issue >> (https://github.com/numpy/numpy/issues/14020) with a request for a >> function to generate a gufunc from a Python function. >> >> numba has the @guvectorize decorator, but I haven't use it much, and >> in my few quick attempts just now, it appeared to not accept fixed >> integer sizes in the output shape. But wait to see if any numba gurus >> respond with a definitive answer about whether or not it can handle >> the shape signature (),()->(),(3),(3). >> >> You could implement the gufunc in a C or C++ extension module, if you >> don't mind the additional development effort and packaging hassle. I >> know that works--I've implemented quite a few gufuncs in ufunclab >> (https://github.com/WarrenWeckesser/ufunclab). >> >> Warren >> >> >> > >> > Thanks in advance, >> > Ben Root >> > _______________________________________________ >> > NumPy-Discussion mailing list -- numpy-discussion@python.org >> > To unsubscribe send an email to numpy-discussion-le...@python.org >> > https://mail.python.org/mailman3//lists/numpy-discussion.python.org >> > Member address: warren.weckes...@gmail.com >> _______________________________________________ >> NumPy-Discussion mailing list -- numpy-discussion@python.org >> To unsubscribe send an email to numpy-discussion-le...@python.org >> https://mail.python.org/mailman3//lists/numpy-discussion.python.org >> Member address: ben.v.r...@gmail.com >> >
_______________________________________________ NumPy-Discussion mailing list -- numpy-discussion@python.org To unsubscribe send an email to numpy-discussion-le...@python.org https://mail.python.org/mailman3//lists/numpy-discussion.python.org Member address: arch...@mail-archive.com