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!
Angenommen, die Werte x
und y
in Ihrer Datei entsprechen direkt den Indizes (wie in Ihrem Beispiel), können Sie etwas Ähnliches tun:
Was ergibt:
%Vor%Bei großen Arrays ist dies viel schneller als die explizite Schleife über die Koordinaten.
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
.
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.
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.
Aber Joes z_array=np.zeros((3,3),int); z_array[xyz['y'],xyz['x']]=xyz['z']
ist wesentlich schneller.
Schöne Antworten von anderen. Dachte, das könnte ein nützlicher Ausschnitt für jemand anderen sein, der das brauchen könnte.
%Vor%