0

A function I'm calling from a shared library returns a structure called info similar to this:

typedef struct cmplx {
  double real;
  double imag;
} cmplx;

typedef struct info{
  char *name;
  int arr_len;
  double *real_data
  cmplx *cmplx_data;
} info;

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:

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,))

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

Ashwith Rego
  • 152
  • 1
  • 1
  • 11

1 Answers1

1

Define your field as double and make a complex view with numpy:

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')
Daniel
  • 42,087
  • 4
  • 55
  • 81
  • The shared library requires that the field be a pointer to the cmplx struct. – Ashwith Rego Oct 16 '16 at 01:14
  • Ok, that did work. Could you please explain why? C requires it to be a pointer to the cmplx struct but we're using a pointer to a c_double object in python. – Ashwith Rego Oct 16 '16 at 01:24
  • a complex number is nothing else, than two doubles. For the interface, the type is not important (you can even use bytes). In the end, the view of your numpy-array defines the type. – Daniel Oct 16 '16 at 11:16
  • I see. Thank you so much for your help! – Ashwith Rego Oct 16 '16 at 12:31