numpy многомерное евклидово расстояние для столбцов pandas фрейма данных - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть pandas фрейм данных, например:

df = pd.DataFrame({'lat_1':[1,2, np.nan], 'long_1':[1,2, np.nan], 'lat_2':[1,2, 3], 'long_2':[1,2, 3], 
                  'lat_1_counterpart':[1,2, np.nan], 'long_1_counterpart':[1,2, np.nan], 'lat_2_counterpart':[1,2,3], 'long_2_counterpart':[1,2,3]})
display(df)

enter image description here

Я пытался np.linalg.norm, но пока получил только странные результаты , Скорее всего, я неправильно кормлю ab. Как я могу исправить это, чтобы быть правильным?

df['linalg_wrong_value'] = np.linalg.norm(df[['lat_1', 'lat_1_counterpart', 'long_1', 'long_1_counterpart', 'lat_2', 'lat_2_counterpart', 'long_2', 'long_2_counterpart']], axis=1)

возвращает что-то, но это кажется неправильным, поскольку мне нужно передать ab в функцию. Попытка:

np.linalg.norm(df[['lat_1', 'long_1', 'lat_2', 'long_2']] - df[['lat_1_counterpart', 'long_1_counterpart', 'lat_2_counterpart', 'long_2_counterpart']], axis=1)

но это также NULL

Теперь при попытке выполнить вычисление вручную:

np.sqrt(np.sum((df.lat_1 -df.lat_1_counterpart)**2))

возвращает только 0,0 как скаляр (не вектор значение), но мне нужно, чтобы этот расчет выполнялся для каждой строки, то есть с axis=1.

Однако:

np.sqrt(np.sum((df.lat_1.values -df.lat_1_counterpart.values)**2 + (df.lat_2.values -df.lat_2_counterpart.values)**2, axis=1), axis=1)
fails with:

ось 1 выходит за пределы для массива измерения 1.

Ожидаемый результат будет:

[0,0,nan]

для уточнения

Я хочу вычесть аналог исходного значения, суммировать все значения и затем взять квадрат root из них.

np.sqrt(np.add((df.lat_1 - df.lat_1_counterpart) **2, (df.lat_2 - df.lat_2_counterpart)**2))

уже работает для двух измерений, но мне нужно включить sum вместо add для поддержки нескольких измерений. К сожалению, я, кажется, испортил оси с несколькими измерениями.

1 Ответ

0 голосов
/ 13 февраля 2020
np.sqrt(np.sum(np.array([(df.lat_1 - df.lat_1_counterpart) **2, (df.long_1 - df.long_1_counterpart) **2]), axis=0))

- это ответ на мой вопрос. Я испортил оси.

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