35

Python numpy には、次のunwrap関数があります。

指定された軸に沿って discont より大きい絶対ジャンプを 2*pi 補数に変更することにより、ラジアン位相 p をアンラップします。

今、私は反対の機能をしたいと思います。フェーズの配列をラップするにはどうすればよいですか? たとえば、すべての角度を変換して -π と π の間で制限するにはどうすればよいですか?

明らかな方法は、次のようなことです。

for i, a in enumerate(phases):
    while a < pi:
        a += 2 * pi
    while a > pi:
        a -= 2 * pi
    phases[i] = a

しかし、もっと簡単で速い方法はありますか?

4

4 に答える 4

12
import numpy as np
phases = np.arctan2(np.sin(phases), np.cos(phases))

これは、sin(位相)/cos(位相) == tan(位相)であるため機能します。逆正接関数を使用して逆位相 (モジュロ 2π) を取得します。数学的には、逆正接関数は多値であるため、プログラミング言語では通常、固定間隔で位相を返すように定義されています。

2 パラメーター逆正接関数、つまりnp.arctan2(numerator, denominator)は、分子と分母の符号を追跡することを除いて、通常の逆正接関数と同じです。したがって、通常のnp.arctan(numerator/denominator)関数ではなく、2π を法とする位相を返すことができます。モジュロ π の位相を返すことができます。関数の Numpy の実装はarctan2、OP が要求した範囲である範囲 [-π, +π] の位相を返すように定義されています。

追加の説明: この arctan2 メソッドは、複素数表現から直接従い、数学的に完全に同等です:

phases = np.angle(np.exp(1j*phases))

これはより直感的かもしれません。実際、numpy のangle関数はarctan2、指数関数の虚数成分と実数成分、つまり正弦と余弦を分離するために舞台裏で使用しています。

于 2015-03-24T16:11:57.587 に答える
8

この回答は、次の sega_sai 回答のわずかなバリエーションです。

phases = ( phases + np.pi) % (2 * np.pi ) - np.pi

これはフェーズを [-pi, pi) にマップします -> これは pi が -pi にマップされることを意味します

ここに示されています:

In [27]: phases = np.pi

In [28]: phases = ( phases + np.pi) % (2 * np.pi ) - np.pi

In [29]: print phases
-3.14159265359

これは完全に正当ですが、(-pi, pi] のマッピングが必要な場合は、

操作の入力と出力を倍にして、-1 を購入します。そのようです:

phases =  (( -phases + np.pi) % (2.0 * np.pi ) - np.pi) * -1.0
于 2015-08-28T08:03:00.800 に答える