Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy/Python中的快速性能数组处理_Python_Arrays_Numpy_Grid - Fatal编程技术网

Numpy/Python中的快速性能数组处理

Numpy/Python中的快速性能数组处理,python,arrays,numpy,grid,Python,Arrays,Numpy,Grid,我试图找到处理存储在多个numpy阵列中的坐标和测量数据的最佳方式(最快的性能) 我需要计算从每个网格点(附加图像中绿色的lot、lon、alt值)到每个测量位置(附加图像中灰色的lat、lon、alt、距离目标的距离)的距离。由于有数百个网格点,每个网格点需要计算数千个测量范围,因此我希望以最有效的方式遍历阵列 我试图决定如何存储网格的LLA测量值和测量值,然后根据测量范围值和实际范围之间的差值计算网格上每个点的均方误差的理想方法是什么 任何关于如何最好地存储这些值,然后在网格上迭代以确定每

我试图找到处理存储在多个numpy阵列中的坐标和测量数据的最佳方式(最快的性能)

我需要计算从每个网格点(附加图像中绿色的lot、lon、alt值)到每个测量位置(附加图像中灰色的lat、lon、alt、距离目标的距离)的距离。由于有数百个网格点,每个网格点需要计算数千个测量范围,因此我希望以最有效的方式遍历阵列

我试图决定如何存储网格的LLA测量值和测量值,然后根据测量范围值和实际范围之间的差值计算网格上每个点的均方误差的理想方法是什么

任何关于如何最好地存储这些值,然后在网格上迭代以确定每个测量值的范围的想法都将非常感谢。谢谢

目前,我正在使用2D meshgrid来存储网格的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
测量类

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
用于距离计算的伪代码非常糟糕(迭代且非常慢)


我认为scipy.spatial.distance模块将帮助您解决此问题:

应将点存储为2列N行的二维numpy数组,其中N是数组中的点数。要将栅格长度和栅格宽度转换为此格式,请使用

N1 = grid_lon.size
grid_point_array = np.hstack([grid_lon.reshape((N1,1)), grid_lat.reshape((N1,1))])
这将获取栅格_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()
这将利用获得点的测量范围与其到每个栅格点的距离之间的差值。然后对给定网格点的所有错误进行求和,得到的一维数组应该是您要查找的累积错误。调用argmin()以查找最小值的位置。要从展平索引获取x和y栅格坐标,请使用

grid_x = flat_grid_idx % gridsize_x
grid_y = flat_grid_idx // gridsize_x

(是整数分割。)

不幸的是,我还不能发布图片,因为我是一个新用户-如果你感兴趣,请给我发邮件,我可以给你发送示例图片。你可以将其发布在某个图片共享网站上并放置链接,而我们中有足够声誉的人可以将其正确地集成到帖子中。收到了-谢谢你的提议!谢谢-这对我很有效。我确实将LLA网格点转换为ECEF(地球中心固定)位置,以在3D中进行求解,因此在XYZ坐标上运行scipy.space.cistance.cdist时,输出将以米为单位。为了解释“实际”与“计算”范围,每个测量值(上面的绿色)具有LLA和到发射器的估计范围。计算网格的目的是找到发射设备,所以我迭代网格上的每个点,找到每个特定点的所有测量的累积误差。误差量最小的点应最接近目标位置。