У меня есть код для соответствия углам к квадрантам круга, в который они попадают. В настоящее время он дает мне результаты, которые я хочу, но я пытаюсь потерять цикл for, чтобы в полной мере использовать скорость numpy.Numpy vectorized меньше/больше, чем сравнение
import numpy as np
angle = np.array([350, 10, 80, 100, 170, 190, 260, 280])
# Center of each quadrant
spawn_angles = np.array([0, 90, 180, 270])
segment_degrees = np.diff(spawn_angles)[0]
lower_bounds = spawn_angles - (segment_degrees/2)
upper_bounds = spawn_angles + (segment_degrees/2)
max_upper = upper_bounds.max()
# Wrap angles larger than the upper bound of the last segment
# back to a negative angle
angle[angle > max_upper] -= 360
quadrant = np.zeros_like(angle, dtype=np.float64)
# Want to make sure that quadrants that don't get calculated
# properly get assigned an invalid number, i.e. -1
quadrant.fill(-1)
for segment_num in range(len(spawn_angles)):
in_segment = ((angle > lower_bounds[segment_num]) &
(angle < upper_bounds[segment_num]))
quadrant[in_segment] = segment_num
# Expected/current output
quadrant
Out[16]: array([ 0., 0., 1., 1., 2., 2., 3., 3.])
В основном часть, что я не могу понять, как это сделать в NumPy является сравнение >
/<
. Если угол между lower_bounds[0]
и upper_bounds[0]
, соответствующей записью из quadrant
получает назначение 0, а так же для квадрантов 1, 2, 3. Есть ли способ сравнить массив углов для всех записей lower_bound
и/или upper_bound
одновременно?
(Если этот код кажется усложненной, некоторые это потому, что spawn_angles
/квадрант центры не всегда [0, 90, 180, 270]
, они также могут быть, например, [45, 135, 225, 315]
)
Отлично, получилось, спасибо за подталкивание в правильном направлении. Я скоро опубликую мой переработанный код в качестве решения, сообщите мне, заметили ли вы какие-либо очевидные ошибки. – Marius