Mit scipy.interpolieren.interpn zur Interpolation in einem N-Dimensionalen array
Angenommen ich habe Daten, die hängt auf 4 Variablen: a, b, c und d.... Ich will interpolieren, um wieder eine 2D-array zurück, das entspricht einem einzelnen Wert von a und b, und ein array von Werten für c und d.... Aber Die array-Größe muss nicht gleich sein. Um genau zu sein, meine Daten stammen aus einem transistor-simulation. Der Strom hängt von 4 Variablen, die hier. Ich möchte zum Plotten eine parametrische variation. Die Anzahl der Punkte auf den parameter ist viel weniger als die Anzahl der Punkte für die horizontale Achse.
import numpy as np
from scipy.interpolate import interpn
arr = np.random.random((4,4,4,4))
x1 = np.array([0, 1, 2, 3])
x2 = np.array([0, 10, 20, 30])
x3 = np.array([0, 10, 20, 30])
x4 = np.array([0, .1, .2, .30])
points = (x1, x2, x3, x4)
Folgende Werke:
xi = (0.1, 9, np.transpose(np.linspace(0, 30, 4)), np.linspace(0, 0.3, 4))
result = interpn(points, arr, xi)
und so tut dieses:
xi = (0.1, 9, 24, np.linspace(0, 0.3, 4))
result = interpn(points, arr, xi)
aber nicht dieses:
xi = (0.1, 9, np.transpose(np.linspace(0, 30, 3)), np.linspace(0, 0.3, 4))
result = interpn(points, arr, xi)
Wie Sie sehen können, im letzten Fall ist die Größe der letzten beiden arrays in xi
ist anders. Ist diese Art von Funktionalität nicht unterstützt, die von scipy oder bin ich mit interpn
falsch? Ich brauche diese erstellen Sie einen plot, wo eine der xi
's ist ein parameter, während die andere ist die horizontale Achse.
- Sieht aus wie Sie sind nicht mit
interpn
richtig... ich gehe davon aus, dasspoints
stellt Ihr Stromnetz, d.h., die "sampling points", die in jeder Ihrer vier Dimensionen für die Werte, die Sie kennen.arr
hält diese bekannten Werte. Aber zufällig heißt, es ist hart zu überprüfen, ob oder nicht die interpolation arbeitet. Versuchen Sie, Sie alle gleich sind, stattdessen, oder noch besser, linear in jedem der vier Dimensionen.xi
sollten die Koordinaten der Punkte, an denen Sie wollen, um zu wissen, die Werte vonarr
.xi
sollte ein array mit k Zeilen, für die k Punkte, und 4 Spalten (4D-Daten). - Dank Praveen! Meine Frage jedoch ist folgende. Angenommen ich habe Daten, die hängt auf 4 Variablen: a, b, c, d.... Ich will interpolieren, um wieder eine 2D-array zurück, das entspricht einem einzelnen Wert von a und b, und ein array von Werten für c und d.... Aber Die array-Größe muss nicht gleich sein. Um genau zu sein, meine Daten stammen aus einem transistor-simulation. Der Strom hängt von 4 Variablen, die hier. Ich möchte zum Plotten eine parametrische variation. Die Anzahl der Punkte auf den parameter ist viel weniger als die Anzahl der Punkte für die horizontale Achse.
- Beim nächsten mal einfach Bearbeiten Sie Ihre Frage direkt, anstelle der Zugabe eine Menge von Informationen in einem Kommentar
- By the way, beachten Sie, dass
np.transpose(np.linspace(0, 30, 3))
macht es nicht zu einem Spalten-Vektor. Lesen Sie über die 1D-arrays in numpy. Sie müssen sich vorstellen, eine neue dimension, so verwenden Sienp.linspace(0, 30, 3)[:, np.newaxis]
statt. Aber in diesem Fall, Sie brauchen nicht dieses, wie ich in meiner Antwort. - Ugh der transpose war ein Fehler. Ich war Einmischung, um mit dem code, um zu sehen, was funktionieren würde und es schlich sich in diesem post. Sorry!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich versuchen zu erklären, dies für Sie in 2D, so dass Sie eine bessere Vorstellung davon bekommen, was passiert. Zuerst erstellen wir ein linear-array zu testen.
Diese uns gibt:
Dann, sagen wir, Sie möchten zu interpolieren entlang einer Linie, d.h., einen Punkt entlang der ersten dimension, aber alle Punkte entlang der zweiten dimension. Diese Punkte werden nicht in den original-arrays
(x1, x2)
offensichtlich. Nehmen wir an, wir wollen zu interpolieren, um einen Punktx1 = 3.5
, die zwischen zwei Punkte auf der x1-Achse.Dies gibt Ihnen das Ergebnis wie gewünscht: beachten Sie, dass die schwarzen Punkte richtig liegen auf der Ebene, bei einem x1 den Wert
3.5
.Beachten Sie, dass die meisten der "Magie", und die Antwort auf deine Frage liegt in diesen zwei Zeilen:
Ich erklärt haben, die arbeiten dieser anderswo. Kurz gesagt, was es tut, ist, erstellen Sie ein array der Größe 10x2, enthält die Koordinaten der 10 Punkte, die Sie wollen, zu interpolieren
arr
an. (Der einzige Unterschied zwischen diesem post und diese ist, dass ich geschrieben habe, dass die Erklärung fürnp.mgrid
, die eine Verknüpfung zu schreibennp.meshgrid
für eine Reihe vonarange
s).Für Ihre 4x4x4x4 Fall, werden Sie wahrscheinlich benötigen, so etwas wie dieses:
Hoffe, das hilft!