2016-12-06 6 views
1

Aufgabe: Ein sich bewegendes Objekt misst einige Parameter pro Sekunde, die mit Messungen von zehn stationären Objekten, die alle 10 Minuten messen, verglichen werden sollen.Iterieren über mehrere Listen mit unterschiedlichen Bedingungen in Python

Bedingungen: Das sich bewegende Objekt in dem Bereich von 100 m von einem der stationären Objekte sein sollte, und in der Zeit a + -5 min Differenz zwischen den beweglichen und stationären Messung, in der Lage sein, die Parameter zu vergleichen.

Listen: time_m, Zeit_s, lon_m, lat_m, lon_s, lat_s, param1_m, param1_s, param2_m, param2_s usw. (m zum Bewegen und s für stationäre (alle Messungen von den zehn stationären Objekten in den gleichen Liste))

Problem: Da die Listen etwa 10^5 Messungen haben, nimmt meine Lösung mit zwei for-Schleifen und zwei if-Anweisungen viel zu lange Zeit in Anspruch. Bitte, können Sie mir helfen, dies besser zu lösen?

Meine Lösung:

dt_m = [datetime.datetime.strptime(item, '%Y-%m-%dT%H:%M:%S') for item in time_m] 
dt_s = [datetime.datetime.strptime(item, '%Y-%m-%dT%H:%M:%S') for item in time_s] 
d = datetime.timedelta(minutes=5) 
lon_hundred_m = 0.00180 #lon degrees for 100 m at lat 60 
lat_hundred_m = 0.00090 #lat degrees for 100 m 

for i in range(len(lon_m)): 
    for j in range(len(lon_s)): 
     if lon_m[i] >= (lon_s[j]-lon_hundred) and lon_m[i] <= (lon_s[j]+lon_hundred) and lat_m[i] >= (lat_s[j]-lon_hundred) and lat_m[i] <= (lat_s[j]+lon_hundred): 
      if dt_s[j] >= dt_m[i]-d and dt_s[j] <= dt_m[i]+d:     
       time_m_2.append(time_m[i]) 
       param1_m_2.append(param1_m[i]) 
       param2_m_2.append(param2_m[i]) 
       lon_m_2.append(lon_m[i]) 
       lat_m_2.append(lat_m[i]) 
       time_s_2.append(time_s[j]) 
       param1_s_2.append(param1_s[j]) 
       param2_s_2.append(param2_s[j]) 
       lon_s_2.append(lon_s[j]) 
       lat_s_2.append(lat_s[j]) 

Dank!

Antwort

0

Eine Lösung könnte Listen sortiert halten und bisect verwenden, um lon_m Elemente für Element in lon_s zu finden. Das wird n^2 zu n*logn reduzieren. Eine komplexere Version würde R-Bäume verwenden (es gibt eine Python-Implementierung here). Ein Seitenkommentar: x >= A and x <= B wird normalerweise als A <= x <= B in Python geschrieben).

Verwandte Themen