2011-12-06 12 views
5

Próbuję znaleźć optymalny sposób (najszybszą wydajność) do przetworzenia danych współrzędnych i pomiarów przechowywanych w kilku odmierzonych tablicach.Szybkie przetwarzanie macierzy wydajności w Numpy/Python

Potrzebuję obliczyć odległość od każdego punktu siatki (partia, długość, wartość alt na zielono w dołączonym obrazie) do każdej lokalizacji pomiaru (lat, lon, alt, zakres od celu w kolorze szarym w załączonym obrazie). Skoro istnieją setki punktów siatki, a tysiące zakresów pomiarowych obliczyć dla każdego punktu siatki Chciałbym iterację tablic w sposób możliwie najbardziej efektywny

enter image description here

Staram się zdecydować między jak przechowywać pomiary LLA dla siatki i pomiarów, a następnie jaka jest idealna metoda obliczania błędu średniej kwadratowej dla każdego punktu na siatce w oparciu o różnicę między zmierzoną wartością zakresu a rzeczywistym zakresem.

Wszelkie sugestie dotyczące najlepszego zapamiętania tych wartości, a następnie iteracji w całej sieci w celu określenia zakresu od każdego pomiaru będą bardzo mile widziane. Dzięki!!!

Obecnie używam 2D ​​meshgrid do przechowywania wartości LLA do siatki

# Create a 2D Grid that will be used to store the MSE estimations 
# First, create two 1-D arrays representing the X and Y coordinates of our grid 
x_delta = abs(xmax-xmin)/gridsize_x 
y_delta = abs(ymax-ymin)/gridsize_y 
X = np.arange(xmin,xmax+x_delta,x_delta) 
Y = np.arange(ymin,ymax+y_delta,y_delta) 

# Next, pass arrays to meshgrid to return 2-D coordinate matrices from the 1-D coordinate arrays 
grid_lon, grid_lat = np.meshgrid(X, Y) 

mam punktów LLA i wartości wahają się od pomiarów przechowywanych w klasie pomiarowej

measurement_lon = [measurement.gps.getlon() for measurement in target_measurements] 
measurement_lat = [measurement.gps.getlat() for measurement in target_measurements] 
measurement_range = [measurement.getrange() for measurement in target_measurements] 

Klasa pomiaru

class RangeMeasurement: 

def __init__(self, lat, lon, alt, range): 
    self.gps = GpsLocation(lat,lon,alt) 
    self.range = range 

Naprawdę zły pseudokod do obliczania zasięgu (iterativ e oraz bardzo powolny)

for i in len(grid_lon): 
    for j in len(measurement_lat): 
    range_error += distance(grid_lon[i],grid_lat[i],measurement_lon[j],measurement_lat[j])-measurement_range[j]  
+0

Niestety nie mogę opublikować zdjęcie jeszcze jak Ama nowy user- mnie wiadomość Jeśli jesteś zainteresowany i mogę przesłać Ci e-mail z przykładowym obrazkiem – Alex

+2

Możesz opublikować go na stronie udostępniania niektórych zdjęć i umieścić link, niż jeden z nas o wystarczającej reputacji może zintegrować go poprawnie w poście. – mac

+0

Rozumiem - dzięki za ofertę! – Alex

Odpowiedz

3

myślę moduł scipy.spatial.distance pomogą Ci się z tym problemem: http://docs.scipy.org/doc/scipy/reference/spatial.distance.html

Należy przechowywać swoje punkty jako 2-d NumPy tablic z 2 kolumn i N wiersze, gdzie N to liczba punktów w tablicy. Aby zamienić grid_lon i grid_lat do tego formatu, użyj

N1 = grid_lon.size 
grid_point_array = np.hstack([grid_lon.reshape((N1,1)), grid_lat.reshape((N1,1))]) 

Dzieje wszystkie wartości w grid_lon, które są rozmieszczone w prostokątnej tablicy, która ma taki sam kształt jak siatki, i umieszcza je w tablicy z jedna kolumna i N wierszy. Robi to samo dla grid_lat. Dwie jednokolumnowe macierze są następnie łączone, aby utworzyć tablicę z dwiema kolumnami.

Podobna metoda może być stosowana do konwersji danych pomiarowych:

N2 = len(measurement_lon) 
measurment_data_array = np.hstack([np.array(measurement_lon).reshape((N2,1)), 
    np.array(measurement_lat).reshape((N2,1))]) 

Gdy dane są w tym formacie, można łatwo znaleźć odległości między każdą parą punktów z scipy.spatial.distance:

d = scipy.spatial.distance.cdist(grid_point_array, measurement_data_array, 'euclidean') 

d będzie tablicą z rzędami N1 i kolumnami N2, a d [i, j] będzie odległością między punktem siatki i punktem pomiarowym j.

EDYTA Dzięki za wyjaśnienie błędu zakresu. Brzmi jak interesujący projekt.To powinno dać punkt siatki z najmniejszym błędem zgromadzonego kwadratu:

measurement_range_array = np.array(measurement_range) 
flat_grid_idx = pow(measurement_range_array-d,2).sum(1).argmin() 

ten wykorzystuje broadcasting uzyskać różnicę między zmierzoną punktu w zasięgu i jego odległości od każdego punktu siatki. Wszystkie błędy dla danego punktu siatki są następnie sumowane, a wynikowa tablica 1-D powinna być sumarycznym błędem, którego szukasz. Funkcja argmin() jest wywoływana w celu znalezienia pozycji o najmniejszej wartości. Aby uzyskać współrzędne X i Y siatki z indeksu spłaszczonym, użyj

grid_x = flat_grid_idx % gridsize_x 
grid_y = flat_grid_idx // gridsize_x 

(// jest liczbą całkowitą podział).

+0

Dzięki - to zadziałało dla mnie świetnie. Przerobiłem punkty siatki LLA na pozycje ECEF (Earth Centered Earth Fixed), aby rozwiązać je w 3D, a więc wynik byłby w metrach przy uruchomieniu scipy.spatial.cistance.cdist na współrzędnych XYZ. – Alex

+0

Aby objaśnić zakres "Rzeczywisty" w stosunku do "Obliczonego", każdy z pomiarów (na zielono powyżej) ma LLA i szacowany zakres do nadajnika. Zadaniem siatki obliczeniowej jest znalezienie urządzenia nadawczego, dlatego też przechodzę przez każdy punkt siatki i znajduję nagromadzony błąd wszystkich pomiarów do każdego punktu. punkt o najmniejszym błędzie powinien znajdować się najbliżej pozycji docelowej. – Alex