簡體   English   中英

Numpy / Python中的快速性能數組處理

[英]Fast performance array processing in Numpy/Python

我試圖找出處理存儲在幾個numpy數組中的坐標和測量數據的最佳方式(最快的性能)。

我需要計算從每個網格點(附圖中的綠色,lon,alt值)到每個測量位置(lat,lon,alt,附加圖像中灰色的目標范圍)的距離。 看到有數百個網格點,以及為每個網格點計算的數千個測量范圍,我想以最有效的方式迭代數組

在此輸入圖像描述

我試圖決定如何存儲網格和測量的LLA測量值,然后根據測量范圍值和實際范圍之間的差值計算網格上每個點的平均平方誤差的理想方法。 。

關於如何最好地存儲這些值,然后在網格中迭代以確定每次測量的范圍的任何想法都將非常受歡迎。 謝謝!!!

目前,我正在使用2D網格網格來存儲網格的LLA值

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

我有測量類中存儲的測量值的LLA點和范圍值

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]

測量類

class RangeMeasurement:

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

用於范圍計算的非常糟糕的偽代碼(迭代且非常慢)

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]      

我認為scipy.spatial.distance模塊將幫助您解決這個問題: http ://docs.scipy.org/doc/scipy/reference/spatial.distance.html

您應該將點存儲為具有2列和N行的2-d numpy數組,其中N是數組中的點數。 要將grid_lon和grid_lat轉換為此格式,請使用

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

這將獲取grid_lon中的所有值,這些值排列在與網格形狀相同的矩形陣列中,並將它們放在具有一列和N行的數組中。 它對grid_lat也是一樣的。 然后組合兩個單列寬陣列以創建兩列陣列。

可以使用類似的方法轉換您的測量數據:

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

一旦您的數據采用這種格式,您就可以使用scipy.spatial.distance輕松找到每對點之間的距離:

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

d將是具有N1行和N2列的陣列,並且d [i,j]將是網格點i和測量點j之間的距離。

編輯感謝澄清范圍錯誤。 聽起來像一個有趣的項目。 這應該為您提供具有最小累積平方誤差的網格點:

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

這利用廣播來獲得點的測量范圍與其與每個網格點的距離之間的差異。 然后對給定網格點的所有誤差求和,得到的1-D數組應該是您正在尋找的累積誤差。 調用argmin()來查找最小值的位置。 要從展平的索引中獲取x和y網格坐標,請使用

grid_x = flat_grid_idx % gridsize_x
grid_y = flat_grid_idx // gridsize_x

(//是整數除法。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM