Ich arbeite mit großen Arrays von geophysikalischen Daten. Ich habe zwei numpy Arrays, die Größen 320 x 340 haben: erste XLAT
enthält die Breite von jedem Punkt im Raster, die zweite XLON
enthält die Länge von jedem Punkt im Raster. So beschreibt jeder i, j
den Punkt auf dem Boden mit Breitengrad XLAT[i][j]
und Längengrad XLON[i][j]
.Suche Elemente in zwei Arrays im angegebenen Bereich mit numpy.where()
Ich habe Punkt mit Koordinaten P_LAT
und P_LON
und ich muss den nächsten 4 Punkt zum gegebenen Punkt finden.
Zuerst schrieb ich einfache Funktion, die durch alle Punkte auf X-Achse und Y-Achse laufen, aber es macht 320 * 340 = 108 800 Iterationen und funktioniert sehr sehr langsam (~ 0,5 Sekunden für jeden Punkt):
for i in range(0, lat-1):
for j in range(0, lon-1):
if ST_LON >= XLON[i][j] and \
ST_LON < XLON[i][j + 1] and \
ST_LAT >= XLAT[i][j] and \
ST_LAT < XLAT[i + 1][j]:
return (True, i, i + 1, j, j + 1)
Dann fand ich einige Informationen über numpy.where()
und schrieb diesen Code:
for i in range(0, lat):
rows = numpy.where((XLON[i] >= ST_LON - 0.5) & (XLON[i] <= ST_LON + 0.5))
for j in rows[0]:
if ST_LON >= XLON[i][j] and \
ST_LON < XLON[i][j + 1] and \
ST_LAT >= XLAT[i][j] and \
ST_LAT < XLAT[i + 1][j]:
return (True, i, i + 1, j, j + 1)
Diese Funktion ist viel schneller (~ 0,015 sec für jeden Punkt), aber ich glaube nicht, es ist das Recht und schöne Lösung.
So ist meine letzte Frage, wie kann ich die Elemente in beiden Feldern finden, die die Bedingungen erfüllen:
XLON[i] <= ST_LON <= XLON[i][j+1]
und XLAT[i][j] <= ST_LAT <= XLAT[i+1][j]
und dies sollte schnell arbeiten?
Meinen Sie damit XLON [i] [j] statt XLON [i] in deiner Linie mit den Bedingungen? – quantummind
Sie haben sich zwei Ziele gesetzt. 1: Finde die nächsten 4 Punkte. 2: Finde die Gegenstände, die die Bedingungen erfüllen. Welches ist was du willst? – quantummind
XLON und XLAT haben beide Größe 320x340. Die Bedingung ist, die 4 nächsten Punkte zu finden, und ich habe versucht, es mit der gegebenen Bedingung zu machen. – Greg