On Sun, 2021-01-10 at 09:59 -0700, zoj613 wrote: > Hi all, > > I am looking for a way to use `np.PyArray_MultiIterNew2` in Cython to > broadcast parameters of a function. The requirement is that the two > arguments can be scalar and/or sequences. Using the usual > `np.broadcast` > function works well but is slow when iterating over the broadcasted > input in > a tight loop. I want to achieve the same using the C API.
NB: There is also a different, newer, iterator (`NpyIter_New`).
Depending on what you do, that might be a lot faster and better
(although, I admit it tends to be more verbose too).
That iterator also does broadcasting, and one nice property is that it
can allocate a result array. Most importantly, it casts for you and
allows you to take charge of the inner-loop (a one dimensional loop)
for performance. (This is the core of how ufuncs work.)
> Currently, if I used `(<double*>np.PyArray_MultiIter_DATA(bcast,
> i))[0]` to
> iterate over the input when one of them is a scalar,
> I get no errors, but I notice the output of the parent function
> returns an
> array of zeros, which implies this approach didn't work. After
> investigating, it seems that np.PyArray_MultiIter_DATA only accepts
> numpy
> arrays.
I am honestly confused by this (did you mean a different command?).
`PyArray_MultiIter_DATA` returns a pointer to the raw data, i.e. in
cython you would probably do:
cdef double *value_ptr = <double *>npc.PyArray_MultiIter_DATA(iter, 0)
value_ptr[0] = 3.1416
Do want to reference the original data? You could reference the
original data for scalars (read-only since scalars are immutable), but
for lists/tuples there is no original data to begin with (unless you
have Python objects inside, but it would seem strange if NumPy to
attempted to transparently expose that).
> I could write a function to handle all combinations of
> scalar/array/list/tuple, and create temporary arrays to store the
> input
The typical pattern is to convert everything to array first, but
`PyArray_MultiIter()` does that for you. Unless you want to optimize
that conversion away?
Cheers,
Sebastian
> data, but that seems daunting and error prone. Is there a way I can
> achieve
> this and have scalar arguments passed to np.PyArray_MultiIter_DATA be
> converted to same-element arrays without writing my own code from
> scratch?
>
> Any suggestions are welcome.
>
>
>
> --
> Sent from: http://numpy-discussion.10968.n7.nabble.com/
> _______________________________________________
> NumPy-Discussion mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/numpy-discussion
>
signature.asc
Description: This is a digitally signed message part
_______________________________________________ NumPy-Discussion mailing list [email protected] https://mail.python.org/mailman/listinfo/numpy-discussion
