Как создать «круговой» массив, где 1 так же близко к 360, как 359?

#python #arrays #python-3.x

Вопрос:

Я работаю с некоторыми данными об ориентации разломов в осадочном хребте. Я измерил направление по компасу, в которое погружаются обломки, и поместил данные в массивы numpy. Проблема в том, что массивы теперь линейны. Как я могу сказать Python, что, когда я выполняю статистический анализ, 357 и 3 имеют одинаковое расстояние до 360? Можно ли создать круговой массив?

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

1. Тебе это может пригодиться min((a1-a2)60, (a1-a2)60) . Это даст наименьшее количество градусов по кругу, по часовой стрелке или против часовой стрелки. Другой вариант-преобразовать углы в точки на единичной окружности (cos(a1), sin(a1)) , а (cos(a2), sin(a2)) затем найти евклидово расстояние между этими точками.

Ответ №1:

Трудно сказать, как помочь вам без MWE, но я могу указать, что по модулю (%) обычно обрабатываются циклические величины.

 1-360           # -359
360-359         # 1
(1-360) % 360   # 1
(360-359) % 360 # 1

359-360         # -1
360-1           # 359
(359-360) % 360 # 359
(360-1) % 360   # 359
 

Если направление не имеет значения, вы можете найти минимальную угловую разницу с помощью:

 def diff(a, b, turn=360): return min( ((a-b) % turn) , ((b-a) % turn) )