Python-numpy: erstellen von 2d-array von Werten basierend auf Koordinaten
Ich habe eine Datei mit 3 Spalten, wobei die ersten beiden Koordinaten (x,y) und der Dritte ist ein Wert (z) entsprechenden position. Hier ein kurzes Beispiel:
x y z
0 1 14
0 2 17
1 0 15
1 1 16
2 1 18
2 2 13
Ich möchte ein 2D-array mit Werten aus der Dritten Reihe, basierend auf deren x -, y-Koordinaten in der Datei. Ich lese in jeder Spalte als einen einzelnen array, und ich erstellte raster der x-Werte und y-Werte mithilfe von numpy.meshgrid, wie diese:
x = [[0 1 2] and y = [[0 0 0]
[0 1 2] [1 1 1]
[0 1 2]] [2 2 2]]
aber ich bin neu in Python und weiß nicht, wie um eine Dritte zu erzeugen grid Werte von z, die wie folgt aussieht:
z = [[Nan 15 Nan]
[14 16 18]
[17 Nan 13]]
Ersetzen Nan
mit 0
wäre in Ordnung, zu, mein Haupt-problem ist die Erstellung der 2D-array in den ersten Platz. Vielen Dank im Voraus für Eure Hilfe!
- Ich konnte nicht verstehen, was ist die erwartete Funktionalität hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, die
x
undy
Werte in Ihrer Datei direkt entsprechen Indizes (wie in deinem Beispiel), Sie können tun, etwas ähnliches wie das hier:Welche ergibt:
Für große arrays, das wird viel schneller als die explizite Schleife über die Koordinaten.
Umgang mit non-uniform x & y-Eingang
Wenn Sie regelmäßig beprobt x & y Punkte, dann können Sie konvertieren Sie raster-Indizes, indem man die "Ecke" von Ihrem Netz (dh
x0
undy0
), dividiert durch den Zellenabstand, Guss-und als int-Werte. Sie können dann die oben genannte Methode nutzen oder in einer der anderen Antworten.Als ein Allgemeines Beispiel:
Allerdings gibt es ein paar tricks, die Sie verwenden können, wenn Ihre Daten nicht in regelmäßigen Abständen.
Lassen Sie uns sagen, dass wir die folgenden Daten:
Wollen wir in regelmäßigen 10x10 raster:
Können wir tatsächlich nutzen/Missbrauch
np.histogram2d
für diese. Statt zählt, wir müssen es hinzufügen, den Wert für jeden Punkt, der fällt in eine Zelle. Es ist am einfachsten, dies durch die Angabeweights=z, normed=False
.Jedoch, wenn wir eine große Anzahl von Punkten, einige Behälter mehr als einen Punkt. Die
weights
argumentnp.histogram
einfach fügt die Werte. Das ist wahrscheinlich nicht das, was Sie wollen, in diesem Fall. Dennoch, können wir den Mittelwert der Punkte, die fallen, die in jeder Zelle durch Teilung durch den Grafen.So, zum Beispiel, sagen wir, wir haben 50 Punkte:
Mit einer sehr großen Anzahl von Punkten, das genaue Methode werden langsam (und kann beschleunigt werden leicht), aber es reicht für etwas weniger als ~1e6 Punkte.
x
undy
Werten eigentlich gar nicht entsprechen Indizes. Ich glaube, das war eine schlechte Wahl der Beispiel! Stattdessen, Sie sind ein bisschen zufällig, wie27 31 14
für meine erste Zeile in der Datei.np.histogramdd
für den n-dimensionalen Fall, soweit ich weiß. Werden Sie sich bewusst von den früheren Nachteil der Geschwindigkeit, obwohl. Es kann langsamer mit hochdimensionalen Datensätzen.Kezzos mich zu schlagen, aber ich hatte einen ähnlichen Ansatz,
Könnten Sie versuchen, so etwas wie:
arr[coord[0], coord[1]]
ist eine bessere Möglichkeit der Indizierung ein 2d-array.Wenn Sie
scipy
installiert, können Sie die Vorteile von Ihrsparse
matrix-Modul. Erhalten Sie die Werte aus der Textdatei mitgenfromtxt
, und stecken Sie diesen 'Spalten' direkt in einsparse
matrix-Schöpfer.Aber Joe ' s
z_array=np.zeros((3,3),int); z_array[xyz['y'],xyz['x']]=xyz['z']
wesentlich schneller.Nette Antworten von anderen. Dachte, das könnte ein nützliches snippet für jemand anderen, vielleicht brauchen diese.