Wie kann man ein NumPy komplexes Array mit C-Funktion mit Ctypes verbinden?

Ich habe eine Funktion in C, die eine Reihe von komplexen Schwimmern nimmt und Berechnungen an ihnen an Ort und Stelle:

/* foo.c */ void foo(cmplx_float* array, int length) {...} 

Die komplexe Float-Struktur sieht so aus:

 typedef struct cmplx_float { float real; float imag; } cmplx_float ; 

Ich muss diese Funktion in python mit ctypes aufrufen. In Python habe ich ein Numpy 1-D ndarray von komplexen 64 Elementen.

Ich habe auch eine Klasse abgeleitet von ctypes.Structure:

 class c_float(Structure): _fields_ = [('real', c_float), ('imag', c_float)] 

Ich stelle mir vor, dass ich eine andere Python-Klasse benötigen könnte, die ein Array von Strukturen implementiert. Insgesamt habe ich nur Probleme mit der Verbindung der Stücke zusammen. Was muss getan werden, um irgendwie meine Funktion in Python zu nennen, im Grunde so etwas wie das mehr oder weniger:

 some_ctype_array = SomeConversionCode(cmplx_numpy_array) lib.foo(some_ctype_array, length) 

  • Ruf c von python mit ctypes: vorübergehende vektoren
  • Wie man Arrays aus einem arrangierten numpy Array extrahiert?
  • Filtern einer Liste basierend auf einer Liste von Booleschen
  • Polynomregression mit Python
  • Fehler beim Importieren von numpy bei Python 3.5.1
  • Installiere numpy.exe leise mit Batch-Datei in Windows
  • Holen Sie sich kreuzende Zeilen über zwei 2D-Numpy-Arrays
  • Ist es möglich, komplexe Zahlen als Zieletiketten in scikit lernen zu lernen?
  • One Solution collect form web for “Wie kann man ein NumPy komplexes Array mit C-Funktion mit Ctypes verbinden?”

    Sie können den ndpointer von numpy.ctypeslib , um das erste Argument zu deklarieren, um ein eindimensionales zusammenhängendes Array vom Typ numpy.complex64 :

     import numpy as np from numpy import ctypeslib # ...code to load the shared library as `lib` not shown... # Declare the argument types of lib.foo: lib.foo.argtypes = [ctypeslib.ndpointer(np.complex64, ndim=1, flags='C'), c_int] 

    Dann können Sie zum Beispiel tun,

     z = np.array([1+2j, -3+4j, 5.0j], dtype=np.complex64) lib.foo(z, z.size) 

    Vielleicht möchten Sie das in einer Funktion wickeln, die das zweite Argument nicht benötigt:

     def foo(z): # Ensure that we use a contiguous array of complex64. If the # call to foo(z, z.size) modifies z in place, and that is the # intended effect of the function, then the following line should # be removed. (The input z is then *required* to be a contiguous # array of np.complex64.) z = np.ascontiguousarray(z, dtype=np.complex64) # Call the C function. lib.foo(z, z.size) 
    Python ist die beste Programmiersprache der Welt.