Reputation: 15
I am new to C and ctypes in Python.
I need to convert a C pointer to an array of doubles into a Python numpy array.
I have the following starting point:
import ctypes
import numpy as np
arrayPy = np.array([[0, 1, 2], [3, 4, 5]])
out_c = arrayPy.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
May I ask how I can efficiently convert the "out_c" object to a Python numpy array?
Upvotes: 0
Views: 619
Reputation: 177674
The starting point is incorrect since arrayPy
is an array of integers. Set the dtype
to make an array of doubles:
import ctypes
import numpy as np
arrayPy = np.array([[0, 1, 2], [3, 4, 5]], dtype=ctypes.c_double)
out_c = arrayPy.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
print(out_c, out_c[:arrayPy.size])
Output is a C pointer to double. Slicing the pointer will show the data, but you need to know the size to not iterate past the end of the data:
<__main__.LP_c_double object at 0x000001A2B758E3C0> [0.0, 1.0, 2.0, 3.0, 4.0, 5.0]
I need to convert a C pointer to an array of doubles into a Python numpy array.
To convert that pointer back to a numpy array, you can use the following if you know its shape:
a = np.ctypeslib.as_array(out_c, shape=arrayPy.shape)
print(a)
Output:
[[0. 1. 2.]
[3. 4. 5.]]
Upvotes: 1