Numpy сопоставляет 3D-массив с 2D-массивом, но массивы не совпадают

#python #python-3.x #numpy

#python #python-3.x #numpy

Вопрос:

Я не уверен, как лучше всего это сделать, но у меня есть файл данных со списком координат x, y и некоторой величины. Допустим, население.

 X, Y, POP
1.2, 1.3, 1000
22.5, 2.5, 250
...
98.6, 1.7, 1500
  

Итак, сначала я округляю X и Y до ближайшего int и создаю сеточную сетку на основе диапазона минимальных и максимальных значений.

 Xmin = np.amin(df['X'])
Xmax = np.amax(df['X'])

Ymin = np.amin(df['Y'])
Ymax = np.amax(df['Y'])

## I use a step of 10 as I don't have enough memory for a step counter of 1
## This is where the problem is
X = np.arange(int(Xmin), int(Xmax), 10) 
Y = np.arange(int(Ymin), int(Ymax), 10)

xx, yy = np.meshgrid(X, Y)
  

Итак, теперь у меня есть сетка, которая содержит все мои координаты. Проблема теперь заключается в том, что я хочу, чтобы эта новая сетка сетки содержала мои значения величины из фрейма данных.

Таким образом, я хочу сопоставить свой df с сеткой meshgrid, чтобы получить что-то вроде этого.

 X, Y, POP
1, 1, 1000
10, 1, N/A
20, 1, 250
...
90, 1, 1500
  

Это то, что я использовал для решения своей проблемы, но это медленно и сравнивает каждое значение. Я полагаю, мой вопрос сводится к тому, есть ли более быстрый / эффективный метод по сравнению с моим кодом ниже? В конечном счете, я планирую заполнить значения N / A, используя среднее значение окружающих ячеек. Но для этого я хочу сначала отобразить все в красивую однородную сетку.

 state = np.empty([X.shape[0], Y.shape[0]])
state[:] = np.nan

for i in range(0, len(X), 1):
    for j in range(0, len(Y), 1):
        for z in range(0, len(df['X']), 1):
            if (abs(X[i] - df['X'][z]) < 10) and (abs(Y[j] - df['Y'][z]) < 10):
                state[i,j] = df['POP'][z]
  

Комментарии:

1. Вам следует рассмотреть возможность объединения pandas для двух массивов.

Ответ №1:

 precision = -1  # the number of digits to round off
df.groupby(
    [df['X'].round(precision), df['Y'].round(precision)]
).POP.sum().unstack().reindex(np.arange(...), np.arange(...))
  

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