Ale*_*lex 5 python arrays grid numpy
我试图找出处理存储在几个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)
Run Code Online (Sandbox Code Playgroud)
我有测量类中存储的测量值的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]
Run Code Online (Sandbox Code Playgroud)
测量类
class RangeMeasurement:
def __init__(self, lat, lon, alt, range):
self.gps = GpsLocation(lat,lon,alt)
self.range = range
Run Code Online (Sandbox Code Playgroud)
用于范围计算的非常糟糕的伪代码(迭代且非常慢)
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]
Run Code Online (Sandbox Code Playgroud)
我认为 scipy.spatial.distance 模块将帮助您解决这个问题:http://docs.scipy.org/doc/scipy/reference/spatial.distance.html
您应该将点存储为具有 2 列和 N 行的二维 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))])
Run Code Online (Sandbox Code Playgroud)
这将获取 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))])
Run Code Online (Sandbox Code Playgroud)
一旦数据采用这种格式,您就可以使用 scipy.spatial.distance 轻松找到每对点之间的距离:
d = scipy.spatial.distance.cdist(grid_point_array, measurement_data_array, 'euclidean')
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
这利用广播来获取点的测量范围与其到每个网格点的距离之间的差异。然后将给定网格点的所有误差相加,得到的一维数组应该是您要查找的累积误差。调用 argmin() 来查找最小值的位置。要从展平索引中获取 x 和 y 网格坐标,请使用
grid_x = flat_grid_idx % gridsize_x
grid_y = flat_grid_idx // gridsize_x
Run Code Online (Sandbox Code Playgroud)
( // 是整数除法。)