Python numpy: Erstelle ein 2D-Array von Werten basierend auf Koordinaten

7

Ich habe eine Datei mit 3 Spalten, wobei die ersten beiden Koordinaten (x, y) sind und die dritte ein Wert (z) ist, der dieser Position entspricht. Hier ist ein kurzes Beispiel:

%Vor%

Ich möchte ein 2D-Array von Werten aus der dritten Zeile basierend auf ihren x, y-Koordinaten in der Datei erstellen. Ich lese in jeder Spalte als einzelnes Array, und ich erstellte Gitter von x-Werten und y-Werten mit numpy.meshgrid, wie folgt:

%Vor%

Aber ich bin neu bei Python und weiß nicht, wie man ein drittes Gitter mit z-Werten erzeugt, das so aussieht:

%Vor%

Das Ersetzen von Nan durch 0 wäre auch in Ordnung; Mein Hauptproblem ist das Erstellen des 2D-Arrays an erster Stelle. Vielen Dank im Voraus für Ihre Hilfe!

    
Aero 10.06.2015, 18:55
quelle

5 Antworten

20

Angenommen, die Werte x und y in Ihrer Datei entsprechen direkt den Indizes (wie in Ihrem Beispiel), können Sie etwas Ähnliches tun:

%Vor%

Was ergibt:

%Vor%

Bei großen Arrays ist dies viel schneller als die explizite Schleife über die Koordinaten.

Umgang mit ungleichmäßigen x & amp; y Eingabe

Wenn Sie regelmäßig x & amp; y Punkte, dann können Sie sie in Gitterindexe umrechnen, indem Sie die "Ecke" Ihres Gitters (d. h. x0 und y0 ) subtrahieren, durch den Zellenabstand dividieren und als Ints werfen. Sie können dann die obige Methode oder eine der anderen Antworten verwenden.

Als ein allgemeines Beispiel:

%Vor%

Es gibt jedoch ein paar Tricks, die Sie verwenden können, wenn Ihre Daten nicht regelmäßig voneinander getrennt sind.

Nehmen wir an, wir haben folgende Daten:

%Vor%

Das wollen wir in ein reguläres 10x10 Gitter einfügen:

Wir können /% np.histogram2d tatsächlich dafür verwenden / missbrauchen. Statt Zählungen fügen wir den Wert jedes Punktes hinzu, der in eine Zelle fällt. Am einfachsten ist dies durch Angabe von weights=z, normed=False .

%Vor%

Wenn wir jedoch eine große Anzahl von Punkten haben, haben einige Fächer mehr als einen Punkt. Das Argument weights zu np.histogram einfach fügt die Werte hinzu. Das ist wahrscheinlich nicht das, was du in diesem Fall willst. Nichtsdestoweniger können wir den Mittelwert der Punkte erhalten, die in jede Zelle fallen, indem wir durch die Zählungen dividieren.

Nehmen wir zum Beispiel an, wir haben 50 Punkte:

%Vor%

Bei einer sehr großen Anzahl von Punkten wird diese genaue Methode langsam (und kann schnell beschleunigt werden), reicht aber für weniger als ~ 1e6 Punkte.

    
Joe Kington 10.06.2015 19:23
quelle
4

Kezzos hat mich dazu gebracht, aber ich hatte einen ähnlichen Ansatz,

%Vor%     
Dave 10.06.2015 19:20
quelle
4

Sie könnten etwas wie:

versuchen %Vor%     
kezzos 10.06.2015 19:15
quelle
2

Wenn Sie scipy installiert haben, können Sie das sparse -Matrixmodul nutzen. Rufen Sie die Werte aus der Textdatei mit genfromtxt ab und schließen Sie diese 'Spalten' direkt an einen sparse -Matrix-Ersteller an.

%Vor%

Aber Joes z_array=np.zeros((3,3),int); z_array[xyz['y'],xyz['x']]=xyz['z'] ist wesentlich schneller.

    
hpaulj 10.06.2015 22:38
quelle
0

Schöne Antworten von anderen. Dachte, das könnte ein nützlicher Ausschnitt für jemand anderen sein, der das brauchen könnte.

%Vor%     
Solomon Vimal 05.04.2018 22:45
quelle

Tags und Links