2

ich eine ziemlich einfache Frage habe: Ich brauche die Datei mit geographischen Koordinaten wiePython | NumPy | Koordinaten - Ein Problem mit Umwandlung von geographischen Koordinaten

Lat   Long 
50 0 50  35 1 40 
50 2 50  35 10 20 
50 3 1  35 13 22 
50 2 38  35 14 40 
49 59 6  35 13 22 
49 57 14 35 13 21 
49 57 10 35 13 0 
49 57 0  35 6 20 

zur

Lat  Long 
50.01389,35.02778 
50.04722,35.17222 
etc. 

Mathe ist so einfach wie ein konvertieren Kuchen: Wir müssen Minuten (0 und 1 in diesem speziellen Fall) um 60 und Sekunden (50 und 40) um 3600 teilen, dann addieren Sie diese Zahlen und wir erhalten den Rest des Grades (50 und 35).

Hier ist mein Skript mit numpy. Ich nehme an, es sieht zu groß für solch eine einfache Umwandlung aus, aber ich weiß nicht, wie man das einfacher macht. Außerdem weiß ich nicht, wie man dieses Skript beendet, damit es tun kann, was es sollte. Jetzt endet es mit dem Hinzufügen von Minuten und Sekunden.

import sys 
import numpy as np 


filename = input('Please enter the file\'s name: ') 
with open(filename, "r") as f: 
    sys.stdout = open('%s (converted).txt' % f.name, 'a') 

    data = np.loadtxt(f) 
    degree_lat, degree_long = data[:, 0], data[:, 3] 
    min_lat, sec_lat, min_long, sec_long = \ 
     (data[:, 1]/60), (data[:, 2]/3600), (data[:, 4]/60), (data[:, 5]/3600) 

    remainder_lat, remainder_long = min_lat + sec_lat, min_long + sec_long 

    degree_result_lat = degree_lat + remainder_lat 
    degree_result_long = degree_long + remainder_long 

Alle Vorschläge würden sehr geschätzt werden! Danke und Entschuldigung für die Amateurfragen.

+0

Können Sie einige Beispielzeilen Ihrer Eingabedatei posten? Was versuchst du auch mit 'sys.stdout = open ...' zu erreichen? –

+0

Ist das eine Frage zur Optimierung/Minimierung Ihres Codes? Vielleicht möchten Sie dann [codereview] (http://codereview.stackexchange.com/) ausprobieren. –

+0

@NilsWerner Ich habe gerade dieses Thema aktualisiert. Sie können ein Beispiel für die Eingabedatei oben finden. – Moveton

Antwort

2

Wenn ich richtig verstehe, was Sie in data Array haben,

data = data.T # not strictly necessary, but simplifies following indexing 

lat = data[0]+data[1]/60.+data[2]/3600. 
lon = data[3]+data[4]/60.+data[5]/3600. 

converted = np.vstack((lat,lon)).T 

np.savetxt(outname, converted) 

Zeile für Zeile Kommentar

  1. data.T das Array transponiert, Spalten wird schleppt und in Python ist es einfacher, um Zeilen als Spalten zu adressieren ...
  2. data[0]+data[1]/60.+data[2]/3600. ist ein vektorisiert Ausdruck, jede Zeile der data Array ist ein Array für sich, und Sie können algebraische Ausdrücke bewerten, möglicherweise auch mit numpy 's Funktionen, die als Argumente akzeptieren, auch Vektorausdrücke.
  3. wie oben ...
  4. np.vstack((lat,lon)).T wir haben zwei Namen, die zwei verschiedene Ausdrücke verweisen, wollen wir sie in einem einzelnen Array kombinieren, so dass wir np.savetxt() es speichern können. Mit np.vstack() bekommen wir ein Array wie

    [[lt0, lt1, ..., ltN], 
    [ln0, ln1, ..., lnN]] 
    

    aber wir wollen ein Array speichern wie

    [[lt0, ln0], 
    [lt1, ln1], 
    ... 
    

    so müssen wir das Ergebnis der np.vstack()

  5. np.savetxt(outname, converted) wir auf einmal die ganze speichern transponieren Array unter Verwendung einer der bequemen Bequemlichkeitsfunktionen, die von den Bibliotheken numpy angeboten werden.

Beachten Sie, dass, wenn numpy verwenden, sollten Sie versuchen explizite Schleifen zu vermeiden und sich stattdessen auf seine Fähigkeit, vectorize unter Berufung meisten Ausdrücke. Dies führt zu viel effizienterem Code.

+0

Danke, das funktioniert auch) Ich wusste nicht über ".T", es scheint eine ziemlich nützliche Option. – Moveton

+1

Es funktioniert besser, weil 1. Sie die Überlastung vermeiden, die mit der Ausführung expliziter Schleifen in einer interpretierten Sprache verbunden ist, und 2. die Ausgabedatei korrekt formatiert ist und von 'np.loadtxt()' geladen werden kann. – gboffi

+0

Wow, vielen Dank für die sehr detaillierte Antwort, für die Vektorisierung und andere. Ich werde versuchen, meine Arbeit in mehr pythonischer Weise zu machen und die Schleifen loszuwerden. Im Moment sieht das noch einfacher aus) – Moveton

2

Dies kann auf eine pythonischere Weise wie folgt durchgeführt werden.

import numpy as np 
f = open('data.txt','r') 
data = np.loadtxt(f) 
coords = [(el[:3],el[3:]) for el in data] 
print coords 
output = [(c[0][0]+c[0][1]/60.+c[0][2]/3600.,c[1][0]+c[1][1]/60.+c[1][2]/3600.) for c in coords] 
print output  

Output:

[(50.013888888888886, 35.027777777777779), 
(50.047222222222217, 35.172222222222217), 
(50.050277777777772, 35.222777777777779), 
(50.043888888888887, 35.244444444444447), 
(49.984999999999999, 35.222777777777779), 
(49.953888888888891, 35.222500000000004), 
(49.952777777777783, 35.216666666666669), 
(49.950000000000003, 35.105555555555554)] 

Erläuterung

Line 4: Lädt die Koordinaten in coords als tuple s
Line 5: Für jede Koordinate in coords berechnet die co- Ordinate im Dezimalsystem und weist sie output als 012 zus

+0

Abdul, toll, danke für das mehr Pythonic Resultat und Erklärung) – Moveton

+0

Übrigens, wie kann ich das Tupel in der Ausgabedatei loswerden? Ich versuche, die for-Schleife und .join zu verwenden, aber es hat nicht geholfen. Gibt es eine einfache Option? – Moveton