[Numpy-discussion] Using the C-API iterator with object arrays
Eric Moore
ewm at redtetrahedron.org
Mon Feb 12 08:22:36 EST 2018
On Mon, Feb 12, 2018 at 6:13 AM, Eugen Wintersberger <
eugen.wintersberger at gmail.com> wrote:
> Hi there,
> I have a question concerning the numpy iterator C-API. I want to create a
> numpy
> string array using NPY_OBJECT as a datatype for creating the array (the
> reason I am going for this
> approach is that I do not know the length of the individual strings at the
> time I construct
> the array, I only know its shape). The original strings are stored
> in a std::vector<char*> instance. The approach I took was something like
> this
>
> std::vector<char*> buffer = ....;
> NpyIter *iter = NpyIter_New(numpy_array,
> NPY_ITER_READWRITE | NPY_ITER_C_INDEX | NPY_ITER_REFS_OK,
> NPY_CORDER , NPY_NO_CASTING,nullptr);
> if(iter==NULL)
> {
> return;
> }
> NpyIter_IterNextFunc *iternext = NpyIter_GetIterNext(iter,nullptr);
> if(iternext == NULL)
> {
> std::cerr<<"Could not instantiate next iterator function"<<std::endl;
> return;
> }
> PyObject **dataptr = (PyObject**)NpyIter_GetDataPtrArray(iter);
> for(auto string: buffer)
> {
> dataptr[0] = PyString_FromSting(string); // this string construction seem to work
> iternext(iter);
> }
> NpyIter_Deallocate(iter);
>
>
> This code snippet is a bit stripped down with all the safety checks
> removed to make
> things more readable.
> However, the array I get back still contains only a None instance. Does
> anyone have an idea
> what I am doing wrong here?
> Thanks in advance.
>
> best regards
> Eugen
>
>
Honestly, given that you're iterating over a single 1D array you've just
constructed, I don't think I would even bother trying to use the iterator.
For this case, a simple loop will be both concise and clear.
Eric
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20180212/2f37f9b1/attachment.html>
More information about the NumPy-Discussion
mailing list