Aufruf von c aus Python mit ctypes: Vektoren übergeben

Ich möchte eine c-Funktion von Python mit ctypes aufrufen. Von demDokumentation Ich verstehe nicht, wie man Zeiger auf Vektoren übergibt. Die Funktion, die ich aufrufen möchte, ist:

double f(int n, double* x)
  {
    int i;
    double p=1;
    for (i=0; i< n; i ++) 
      p = p * x[i];
    return p;
  }

Ich habe die funktion mit void pointer modifiziert, so wird esf(int, void*) mit einer internen Besetzung zu verdoppeln. Ich mache folgendes:

def f(x):
  n = len(x)
  libc = '/path/to/lib.so'
  cn = c_int(n)
  px = pointer(x)
  cx = c_void_p(px)
  libc.restype = c_double
  L = libc.f(cn, cx)
  return L

Ich gehe davon aus, dass x ein Numpy-Array ist, bin mir aber nicht sicher, wie die Numpy-Arrays im Speicher organisiert sind und ob dies die beste Lösung ist.

Bearbeiten:

Keine der vorgeschlagenen Methoden funktioniert mit meinem Numpy-Array. Vielleicht liegt es daran, wie ich das Array definiere:

x = np.array([], 'float64')
f = open(file,'r')
for line in f:
  x = np.append(x,float(line))

aber einige von ihnen funktionieren, wenn ich eine explizite Liste mag[1,2,3,4,5]statt einer Liste, die an einer anderen Stelle definiert wurde und als bezeichnet wirdx

Antworten auf die Frage(3)

Ihre Antwort auf die Frage