numpy.unwrap对面

Cha*_*net 26 python numpy

在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
Run Code Online (Sandbox Code Playgroud)

但有更简单/更快的方式吗?

seg*_*sai 40

phases = (phases + np.pi) % (2 * np.pi) - np.pi
Run Code Online (Sandbox Code Playgroud)

  • 我没有意识到我可以使用带有浮点值的%运算符.但是为什么在执行模数之前加入π? (3认同)
  • @Fnord,这不是`np.unwrap`所做的.你可以自己测试一下 - 在`[-pi,pi)`中生成一个随机数组,并在其上调用`unwrap`.你会得到一个通常不会保留在`[-pi,pi]`中的数组. (3认同)
  • 因为如果您需要结果介于 (-np.pi,np.pi) 而不是 (0,2*np.pi) 之间,则需要这样做。如果您不添加它,而只是减去 0 将被映射到 -&gt; -np.pi 这是不正确的 (2认同)

u55*_*u55 10

import numpy as np
phases = np.arctan2(np.sin(phases), np.cos(phases))
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为sin(阶段)/ cos(阶段)= = tan(阶段).我们通过使用反正切函数得到相位(模2π).在数学上,反正切函数是多值的,因此在编程语言中,通常将其定义为以固定间隔返回相位.

双参数反正切函数,即np.arctan2(numerator, denominator)与常规反正切函数相同,只是它跟踪分子和分母的符号,因此能够返回模2π的相位,而不是np.arctan(numerator/denominator)仅仅是常规函数能够以模数π返回相位.Numpy的arctan2函数实现被定义为返回[-π,+π]范围内的相位,这是OP请求的范围.

附加说明:此arctan2方法直接来自复杂表示,完全在数学上等同于:

phases = np.angle(np.exp(1j*phases))
Run Code Online (Sandbox Code Playgroud)

这可能更直观.实际上,numpy的angle函数arctan2在幕后用来分离指数的虚部和实部,即正弦和余弦.

  • 有趣的是,但效率可能很低。。。但是我给你好评。 (2认同)
  • 我同意这比使用'%`运算符慢,但它对我来说更直观(但也许我是唯一的)因为它直接来自复数表示,请参阅编辑.此外,我不必仔细思考python的'%`运算符是否保持除数或被除数的符号以及它如何影响结果,或者我是否必须在执行mod之前和之后添加然后减去常量操作,以便将结果阶段保持在我想要的范围内. (2认同)

小智 5

此答案与 sega_sai 答案略有不同,即:

phases = ( phases + np.pi) % (2 * np.pi ) - np.pi
Run Code Online (Sandbox Code Playgroud)

这将阶段映射到 [-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
Run Code Online (Sandbox Code Playgroud)

这是完全合法的,但如果你想要一个 (-pi, pi] 的映射,那么

将操作的输入和输出乘以购买 -1。像这样:

phases =  (( -phases + np.pi) % (2.0 * np.pi ) - np.pi) * -1.0
Run Code Online (Sandbox Code Playgroud)