например у меня сериалы векторных
vectors = [
[1+1j], [1j], [-1+1j], [-1], [-1-1j], [-1j], [1-1j], [1],
[1+1j], [1j], [-1+1j], [-1], [-1-1j], [-1j], [1-1j], [1],
]
вы можете обнаружить, что 16 элементов в vectors
фактически вращаются вокруг начала координат против часовой стрелки на 45 градусов (или пи / 4 радиана) друг друга. Так что мне действительно нужно
pi/4, 2*pi/4, 3*pi/4, 4*pi/4, 5*pi/4, 6*pi/4, 7*pi/4, 8*pi/4,
9*pi/4, 10*pi/4, 11*pi/4, 12*pi/4, 13*pi/4, 14*pi/4, 15*pi/4, 16*pi/4
Но np.angle(vectors)
получает
pi/4, 2*pi/4, 3*pi/4, 4*pi/4, -3*pi/4, -2*pi/4, -pi/4, 0,
pi/4, 2*pi/4, 3*pi/4, 4*pi/4, -3*pi/4, -2*pi/4, -pi/4, 0
например, у меня есть сериалы вектора как
vectors = [
[1], [1-j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j],
[1], [1-j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j],
]
вы можете обнаружить, что 16 элементов в vectors
фактически вращаются вокруг начала координат по часовой стрелке на 45 градусов (или пи / 4 радиана) друг друга. Так что мне действительно нужно
0*pi/4, -1*pi/4, -2*pi/4, -3*pi/4, -4*pi/4, -5*pi/4, -6*pi/4, -7*pi/4,
-8*pi/4, -9*pi/4, -10*pi/4, -11*pi/4, -12*pi/4, -13*pi/4, -14*pi/4, -15*pi/4
для
vectors = [
[1-1j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j], [1],
[1-1j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j], [1],
]
Мне нужен ответ, чтобы быть
-*pi/4, -2*pi/4, -3*pi/4, -4*pi/4, -5*pi/4, -6*pi/4, -7*pi/4, -8*pi/4,
-9*pi/4, -10*pi/4, -11*pi/4, -12*pi/4, -13*pi/4, -14*pi/4, -15*pi/4, -15*pi/4
Итак, как сделать новую функцию angle_with_period
, которая удовлетворяет следующим условиям
входным параметром является список / массив [v1, v2, v3...]
, а абс (угол между v [i] и v [i + 1]) всегда не больше, чем pi
angle_with_period
вычисляет угол каждого элемента от положительной действительной оси на комплексной плоскости.
для v1 angle_with_period действует как np.angle, то есть
in | 0 | 1+1j | -1 | -1-1j | 1-1j | ----+-------+--------+--------+--------+-------+ out | 0 | pi/4 | 4*pi/4 |-3*pi/4 | -pi/4 |
vecAnswer = angle_with_period([v1, v2, v3...])
, то vecAnswer представляет собой монотонно увеличивающийся или уменьшающийся массивБлагодарность
2 * пи / 4, пи / 4, 0, -пи / 4, ...
Вот один из способов использования diff
, mod
, cumsum
:
def mono_angle(x):
a = np.angle(x)
b = np.trim_zeros(a, 'f')
if b.size==0: return a
b[1:] = np.diff(b) % (np.sign(b[0])*2*np.pi)
a[-b.size:] = b.cumsum()
return a
Например:
>>> vectors = [
... [1], [1-1j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j],
... [1], [1-1j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j],
... ]
>>> mono_angle(np.ravel(vectors))
array([ 0. , -0.78539816, -1.57079633, -2.35619449,
-3.14159265, -3.92699082, -4.71238898, -5.49778714,
-6.28318531, -7.06858347, -7.85398163, -8.6393798 ,
-9.42477796, -10.21017612, -10.99557429, -11.78097245])
Примечание: вы также можете посмотреть аналогичный np.unwrap
. Он работает на ваших примерах, но в целом не соответствует вашему описанию.
А как насчет векторов = [[1j], [1 + 1j], [1], [1-1j], [-1j], [-1-1j], [-1], [-1 + 1j], [ 1j], [1 + 1j], [1], [1-1j], [-1j], [-1-1j], [-1], [-1 + 1j]]. Какие углы для этого?