I am using a Python (via
... BUNCH OF STACK INFORMATION
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'
Creating NumPy arrays from a ctypes pointer object is a problematic operation. It is unclear who actually owns the memory the pointer is pointing to. When will it be freed again? How long is it valid? Whenever possible I would try to avoid this kind of construct. It is so much easier and safer to create arrays in the Python code and pass them to the C function than to use memory allocated by a Python-unaware C function. By doing the latter, you negate to some extent the advantages of having a high-level language taking care of the memory management.
If you are really sure that someone takes care of the memory, you can create an object exposing the Python "buffer protocol" and then create a NumPy array using this buffer object. You gave one way of creating the buffer object in your post, via the undocumented
buffer = numpy.core.multiarray.int_asbuffer( ctypes.addressof(y.contents), 8*array_length)
(Note that I substituted
np.dtype(float).itemsize. It's always 8, on any platform.) A different way to create the buffer object would be to call the
PyBuffer_FromMemory() function from the Python C API via ctypes:
buffer_from_memory = ctypes.pythonapi.PyBuffer_FromMemory buffer_from_memory.restype = ctypes.py_object buffer = buffer_from_memory(y, 8*array_length)
For both these ways, you can create a NumPy array from
a = numpy.frombuffer(buffer, float)
(I actually do not understand why you use
.astype() instead of a second parameter to
frombuffer; furthermore, I wonder why you use
np.int, while you said earlier that the array contains
I'm afraid it won't get much easier than this, but it isn't that bad, don't you think? You could bury all the ugly details in a wrapper function and don't worry about it any more.