[Numpy-discussion] C-API creating new copy of C data

Sebastian Haase haase at msg.ucsf.edu
Sat Apr 21 17:35:41 EDT 2007


On 4/21/07, Travis Oliphant <oliphant.travis at ieee.org> wrote:
> Bill Baxter wrote:
> > What's the right way to make a new numpy array that's a copy of some C data?
> >
> > There doesn't seem to be any API like PyArray_NewFromDescr that
> > /copies/ the void*data pointer for you.  Do I have to write my own
> > loops for this?  I can do that, it just seems like it should be a
> > library function already, so I'm guessing I'm just overlooking it.
> > There seem to be lots of APIs that will wrap pre-existing memory, but
> > the ones that allocate for you do not seem to copy.
> >
>
> What do you mean by /copies/ the void * data pointer for you?   Do you
> mean the API would
>
> 1) Create new memory for the array
> 2) Copy the data from another void * pointer to the memory just created
> for the new array?
>
> If that is what you mean, then you are right there is no such API.   I'm
> not sure that there needs to be one.  It is a two-liner using memcpy.

Yes, I was thinking about memcpy() -- but how about non-contiguous
data ? or other non well behaved ndarrays (non-aligned, byte-swapped,
...?) ?

>
> > A related question -- I'm only trying to copy in order to save myself
> > a little hassle regarding how to clean up the allocated chunks.  If
> > there's some simple way to trigger a particular deallocation function
> > to be called at the right time, then that would be the ideal, really.
> >
> No, there is no place to store that information in NumPy.  Either the
> ndarray dealloc function frees the memory it created or it doesn't free
> any memory.    I think the best thing to do in this case would be to
> create a memory object wrapping the pointer and then point the ndarray
> to it as the source of memory.
>
Yes, I think one would probably want to create a custom-made python
class that provides the memory as buffer or so. This is what you meant
- right ?  And that class could then define /any/ function to be
called once the ref.count goes to zero - right?
Could someone with C-API knowledge put a sample together !?   This
would also be quite useful to be used with a SWIG output typemap.

-Sebastian



More information about the NumPy-Discussion mailing list