Numpy/Python中的快速性能数组处理
我正在寻找处理存储在多个numpy数组中的坐标和测量数据的最佳方法(最快的性能)。
我需要计算每个网格点(图中绿色的经纬度和高度值)到每个测量位置(图中灰色的经纬度、高度和目标范围)的距离。由于网格点有几百个,而每个网格点需要计算成千上万的测量范围,我希望能以最有效的方式遍历这些数组。
我正在考虑如何存储网格和测量的LLA(经纬度和高度)数据,以及如何根据测量的范围值和实际范围之间的差异,计算网格上每个点的均方误差。
如果你有关于如何最好地存储这些值,并遍历网格以确定每个测量的范围的想法,我将非常感激。谢谢!!!
目前,我正在使用一个二维网格来存储网格的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]
1 个回答
我觉得scipy.spatial.distance这个模块可以帮你解决这个问题:http://docs.scipy.org/doc/scipy/reference/spatial.distance.html
你应该把你的点存储为一个2维的numpy数组,里面有2列和N行,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维数组就是你想要的累积误差。使用argmin()可以找到最小值的位置。要从扁平化的索引中获取x和y的网格坐标,可以使用:
grid_x = flat_grid_idx % gridsize_x
grid_y = flat_grid_idx // gridsize_x
(//是整数除法。)