Casting an array of C structs to a numpy array
<p>A function I'm calling from a shared library returns a structure called info similar to this:</p>

<pre><code>typedef struct cmplx {
  double real;
  double imag;
} cmplx;

typedef struct info{
  char *name;
  int arr_len;
  double *real_data
  cmplx *cmplx_data;
} info;
</code></pre>

<p>One of the fields of the structure is an array of doubles while the other is an array of complex numbers. How do I convert the array of complex numbers to a numpy array? For doubles I have the following:</p>

<pre><code>from ctypes import *
import numpy as np

class cmplx(Structure):
    _fields_ = [("real", c_double),
                ("imag", c_double)]


class info(Structure):
    _fields_ = [("name", c_char_p),
                ("arr_len", c_int),
                ("real_data", POINTER(c_double)),
                ("cmplx_data", POINTER(cmplx))]

c_func.restype = info
ret_val = c_func()
data = np.ctypeslib.as_array(ret_val.contents.real_data, shape=(info.contents.arr_len,))
</code></pre>

<p>Is there a numpy one liner for complex numbers? I can do this using loops.</p>

<p>Define your field as double and make a complex view with numpy:</p>

<pre><code>class info(Structure):
    _fields_ = [("name", c_char_p),
                ("arr_len", c_int),
                ("real_data", POINTER(c_double)),
                ("cmplx_data", POINTER(c_double))]

c_func.restype = info
ret_val = c_func()
data = np.ctypeslib.as_array(ret_val.contents.real_data, shape=(info.contents.arr_len,))
complex_data = np.ctypeslib.as_array(ret_val.contents.cmplx_data, shape=(info.contents.arr_len,2)).view('complex128')
</code></pre>

python arrays python-3.x numpy ctypes