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) 

  • Python-Vektorisierung verschachtelt für Schleifen
  • Riesige Geschwindigkeitsunterschied in Numpy zwischen ähnlichen Code
  • Anwenden von Funktionen auf multidimensionale numpy Arrays ohne Loops
  • Thread-Fehler: kann keinen neuen Thread starten
  • Wie zeichnet man die Eigenwerte bei der Lösung von Matrix-gekoppelten Differentialgleichungen in PYTHON auf?
  • Wie installiere ich h5py (+ numpy + libhdf5 + ...) als Nicht-Root auf einem Debian Linux System
  • Numpy String Encoding
  • Beschränke eine Reihe oder ein Array auf einen Bereich von Werten
  • 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.