Быстрая обработка массивов производительности в Numpy / Python - PullRequest
5 голосов
/ 07 декабря 2011

Я пытаюсь найти оптимальный способ (максимальная производительность) для обработки координат и данных измерений, хранящихся в нескольких числовых массивах.

Мне нужно рассчитать расстояние от каждой точки сетки (lot, lon, altзначение в зеленом цвете на прикрепленном изображении) для каждого места измерения (широта, долгота, высота, диапазон от цели в сером цвете на прикрепленном изображении).Поскольку существуют сотни точек сетки и тысячи диапазонов измерений, которые нужно рассчитать для каждой точки сетки, я бы хотел перебрать массивы наиболее эффективным способом

enter image description here

Я пытаюсь решить, как сохранить измерения 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]      

1 Ответ

3 голосов
/ 07 декабря 2011

Я думаю, что модуль scipy.spatial.distance поможет вам решить эту проблему: http://docs.scipy.org/doc/scipy/reference/spatial.distance.html

Вы должны хранить ваши точки в виде двумерных массивов с двумя столбцами и 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.

EDIT Спасибо за разъяснение ошибки диапазона. Похоже, интересный проект. Это должно дать вам точку сетки с наименьшей накопленной квадратической ошибкой:

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

(// является целочисленным делением.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...