2011-12-06 44 views
5

Tôi đang cố gắng tìm ra cách tối ưu (hiệu suất nhanh nhất) để xử lý dữ liệu tọa độ và đo lường được lưu trữ trong một số mảng có nhiều mảng.Xử lý mảng hiệu suất nhanh trong Numpy/Python

Tôi cần tính khoảng cách từ mỗi điểm lưới (lô, lon, giá trị alt màu xanh lá cây trong ảnh đính kèm) đến từng vị trí đo (lat, lon, alt, range từ mục tiêu màu xám trong ảnh đính kèm). Thấy như có hàng trăm điểm lưới, và hàng ngàn đo dao động để tính toán cho mỗi điểm lưới, tôi muốn lặp qua mảng theo cách hiệu quả nhất có thể

enter image description here

Tôi cố gắng để quyết định giữa làm thế nào để lưu trữ các phép đo LLA cho lưới và phép đo, và cách lý tưởng là tính toán sai số trung bình cho mỗi điểm trên lưới dựa trên đồng bằng giữa giá trị phạm vi đo được và phạm vi thực tế.

Bất kỳ ý tưởng nào về cách lưu trữ tốt nhất các giá trị này và sau đó lặp qua lưới để xác định phạm vi từ mỗi phép đo sẽ được đánh giá rất nhiều. Cảm ơn!!!

Hiện nay, tôi đang sử dụng một meshgrid 2D để lưu trữ các giá trị LLA cho lưới điện

# 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) 

Tôi có điểm LLA và giá trị dao động từ các phép đo được lưu trữ trong một lớp học đo

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] 

Lớp đo lường

class RangeMeasurement: 

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

Mã giả giả thực sự để tính toán phạm vi (iterativ e và rất chậm)

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

Đáng tiếc là tôi không thể gửi hình ảnh chưa như tôi Ama nhắn user- mới tôi nếu bạn quan tâm và tôi có thể gửi cho bạn hình ảnh ví dụ – Alex

+2

Bạn có thể đăng nó lên một số trang chia sẻ hình ảnh và đặt liên kết, hơn một trong số chúng tôi có đủ danh tiếng có thể tích hợp nó vào bài đăng. – mac

+0

OK- cảm ơn vì lời đề nghị! – Alex

Trả lời

3

Tôi nghĩ rằng mô-đun scipy.spatial.distance sẽ giúp bạn ra ngoài với vấn đề này: http://docs.scipy.org/doc/scipy/reference/spatial.distance.html

Bạn nên lưu điểm của bạn như mảng NumPy 2-d với 2 cột và N hàng, trong đó N là số điểm trong mảng. Để chuyển đổi grid_lon và grid_lat của bạn sang định dạng này, sử dụng

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

này có tất cả các giá trị trong grid_lon, được bố trí trong một mảng hình chữ nhật đó là hình dạng giống như lưới điện, và đặt chúng trong một mảng với một hàng và N hàng. Nó làm tương tự cho grid_lat. Hai mảng một cột rộng sau đó được kết hợp để tạo ra một mảng hai cột.

Một phương pháp tương tự có thể được sử dụng để chuyển đổi dữ liệu đo lường của bạn:

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

Sau khi dữ liệu của bạn là ở định dạng này, bạn có thể dễ dàng tìm thấy khoảng cách giữa mỗi cặp điểm với scipy.spatial.distance:

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

d sẽ là một mảng có các hàng N1 và cột N2 và d [i, j] sẽ là khoảng cách giữa điểm lưới i và điểm đo j.

EDIT Cảm ơn bạn đã làm rõ lỗi phạm vi. Nghe có vẻ một dự án hay.Điều này sẽ cung cấp cho bạn các điểm lưới với lỗi bình phương tích lũy nhỏ nhất:

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

này có lợi thế của broadcasting để có được sự khác biệt giữa phạm vi đo của một điểm và khoảng cách từ mỗi điểm lưới. Tất cả các lỗi cho một điểm lưới nhất định sau đó được tóm tắt, và mảng 1-D kết quả sẽ là lỗi tích lũy mà bạn đang tìm kiếm. argmin() được gọi để tìm vị trí của giá trị nhỏ nhất. Để có được x và y lưới tọa độ từ chỉ số phẳng, sử dụng

grid_x = flat_grid_idx % gridsize_x 
grid_y = flat_grid_idx // gridsize_x 

(Các // là số nguyên chia.)

+0

Thanks- điều này làm việc tuyệt vời cho tôi. Tôi đã chuyển đổi các điểm lưới LLA thành các vị trí ECEF (Earth Centered Earth Fixed) để giải quyết ở chế độ 3D và do đó đầu ra sẽ tính bằng mét khi chạy scipy.spatial.cistance.cdist trên tọa độ XYZ. – Alex

+0

Để giải thích phạm vi "Thực tế" so với "Đã tính", mỗi phép đo (màu xanh lá cây ở trên) có LLA và phạm vi ước tính cho bộ phát. Mục đích của lưới tính toán là tìm thiết bị truyền, vì vậy tôi lặp qua từng điểm trên lưới và tìm ra lỗi tích lũy của tất cả các phép đo cho từng điểm cụ thể. điểm có số lượng lỗi thấp nhất phải gần nhất với vị trí đích. – Alex

Các vấn đề liên quan