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) 

  • Laden und Speichern von Numpy Matrix
  • Numpy: Funktion auf zwei numpy Arrays anwenden und zwei numpy Arrays zurückgeben
  • Numpy wo Funktion mehrere Bedingungen
  • Können matplotlib konturen mit pixelkanten übereinstimmen?
  • Wie füge ich ein 'RowNumber' Feld zu einem strukturierten numpy Array hinzu?
  • Funktion zur Berechnung des 3D-Gradienten mit ungleichmäßig beabstandeten Probenorten
  • Warum bietet numpy.linalg.solve () präzisere Matrixinvertierungen als numpy.linalg.inv ()?
  • 3D-Extrapolation in Python (grundsätzlich scipy.griddata erweitert um extrapolieren)
  • 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.