[Numpy-discussion] NumPy C API question

Nathaniel Smith njs at pobox.com
Wed May 21 19:21:58 EDT 2014


Hi Stefan,

Allocating a new PyArrayObject isn't terribly expensive (compared to
all the other allocations that Python programs are constantly doing),
but I'm afraid you have a more fundamental problem. The reason there
is no supported API to change the storage pointer of a PyArrayObject
is that the semantics of PyArrayObject are that the data must remain
allocated, and in the same place, until the PyArrayObject is freed
(and when this happens is in general is up to the garbage collector,
not you). You could make a copy, but you can't free the original
buffer until Python tells you you can. The problem is that many simple
operations on arrays return views, which are implemented as
independent PyArrayObjects whose data field points directly into your
memory buffer; these views will hold a reference to your
PyArrayObject, but there's no supported way to reverse this mapping to
find all the views that might be pointing into your buffer.

If you're very determined there are probably hacks you could use (be
very careful never to allocate views, or maybe gc.getreferrers() will
work to let you run around and fix up all the views), but at that
point you're kind of on your own anyway, and violating PyArrayObject's
encapsulation boundary is the least of your worries :-).

Hope things are well with you,
-n

On Thu, May 22, 2014 at 12:03 AM, Stefan Seefeld <stefan at seefeld.name> wrote:
> Hello,
>
> I would like to expose an existing (C++) object as a NumPy array to
> Python. Right now I'm using PyArray_New, passing the pointer to my
> object's storage. It now happens that the storage point of my object may
> change over its lifetime, so I'd like to change the pointer that is used
> in the PyArrayObject. Is there any API to do this ? (I'd like to avoid
> allocating a new PyArrayObject, as that is presumably a costly operation.)
> If not, may I access (i.e., change) the "data" member of the array
> object, or would I risk corrupting the application state doing that ?
>
> Many thanks,
>         Stefan
>
>
> --
>
>       ...ich hab' noch einen Koffer in Berlin...
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion



-- 
Nathaniel J. Smith
Postdoctoral researcher - Informatics - University of Edinburgh
http://vorpus.org



More information about the NumPy-Discussion mailing list