SciPy Interpolation großer Matrix

Ich habe ein ndarray (Z) mit etwa 500000 Elementen auf einem rechteckigen Gitter (X, Y).

Jetzt möchte ich Werte an etwa 100 Standorten in x, y interpolieren, die nicht unbedingt im Raster sind.

Ich habe einen Code in Matlab:

data = interp2(X,Y,Z, x,y); 

Allerdings, wenn ich versuche, den gleichen Ansatz mit scipy.interpolate verwenden, bekomme ich verschiedene Fehler je nach Methode. Zum Beispiel fällt interp2d mit MemoryError aus, wenn ich kind = 'linear' und 'OverflowError: Zu viele Datenpunkte zu interpolieren', wenn ich kind='cubic' spezifiziere. Ich habe auch versucht Rbf und bisplev aber sie scheitern auch.

Also die Frage ist: Gibt es eine Interpolationsfunktion, die Interpolationen großer Matrizen erlaubt? Gibt es eine andere Lösung für das Problem? (Oder muss ich eine Funktion kodieren, die den passenden Bereich um die Punkte platziert, um zu interpolieren und ruft dann interp2d?)

Dazu: Wie kann man das mit komplexen Zahlen machen?

2 Solutions collect form web for “SciPy Interpolation großer Matrix”

Da Ihre Daten auf einem Raster sind, können Sie RectBivariateSpline verwenden .

Um mit komplexen Nummern zu arbeiten, können Sie data.real und data.imag separat interpolieren (die FITPACK-Routinen IIRC behandeln nicht komplexe Daten).

Bearbeiten: Whoops. Nur realisiert das OP vorgeschlagen, diese Lösung in der Frage!

Ich weiß nicht, warum die Interpolationsroutinen so viel Zeit und Gedächtnis haben, um die Knoten der strukturierten Daten zu finden, aber da du nur einen kleinen Teil des ganzen Rasters benutzt hast, kannst du deine Interpolation in Patches zerlegen, um die Dinge effizienter zu machen .

 from scipy import interpolate import numpy as np def my_interp(X, Y, Z, x, y, spn=3): xs,ys = map(np.array,(x,y)) z = np.zeros(xs.shape) for i,(x,y) in enumerate(zip(xs,ys)): # get the indices of the nearest x,y xi = np.argmin(np.abs(X[0,:]-x)) yi = np.argmin(np.abs(Y[:,0]-y)) xlo = max(xi-spn, 0) ylo = max(yi-spn, 0) xhi = min(xi+spn, X[0,:].size) yhi = min(yi+spn, Y[:,0].size) # make slices of X,Y,Z that are only a few items wide nX = X[xlo:xhi, ylo:yhi] nY = Y[xlo:xhi, ylo:yhi] nZ = Z[xlo:xhi, ylo:yhi] intp = interpolate.interp2d(nX, nY, nZ) z[i] = intp(x,y)[0] return z N = 1000 X,Y = np.meshgrid(np.arange(N), np.arange(N)) Z = np.random.random((N, N)) print my_interp(X, Y, Z, [13.2, 999.9], [0.01, 45.3]) 
Python ist die beste Programmiersprache der Welt.