jax.numpy.unwrap#

jax.numpy.unwrap(p, discont=None, axis=-1, period=6.283185307179586)[源代码]#

展开周期信号。

JAX 对 numpy.unwrap() 的实现。

参数:
  • p (ArrayLike) – 输入数组

  • discont (ArrayLike | None) – 序列中允许的最大不连续性。默认值为 period / 2

  • axis (int) – 展开的轴;默认为 -1

  • period (ArrayLike) – 信号的周期,默认为 \(2\pi\)

返回:

展开后的 p 的副本。

返回类型:

Array

注意事项

此实现遵循 numpy.unwrap(),不适合窄宽度整数(例如 int8int16)或无符号整数的整数周期展开。

示例

考虑一种情况,您正在通过旋转盘的 xy 位置来测量其位置。底层变量是一个始终递增的角度,我们将通过这种方式生成它,使用度作为表示的方便方式:

>>> rng = np.random.default_rng(0)
>>> theta = rng.integers(0, 90, size=(20,)).cumsum()
>>> theta
array([ 76, 133, 179, 203, 230, 233, 239, 240, 255, 328, 386, 468, 513,
       567, 654, 719, 775, 823, 873, 957])

我们对该角度的观测值是 xy 坐标,由该底层角度的正弦和余弦给出:

>>> x, y = jnp.sin(jnp.deg2rad(theta)), jnp.cos(jnp.deg2rad(theta))

现在,假设给定这些 xy 坐标,我们希望恢复原始角度 theta。我们可能会通过 atan2() 函数来实现这一点:

>>> theta_out = jnp.rad2deg(jnp.atan2(x, y)).round()
>>> theta_out
Array([  76.,  133.,  179., -157., -130., -127., -121., -120., -105.,
        -32.,   26.,  108.,  153., -153.,  -66.,   -1.,   55.,  103.,
        153., -123.], dtype=float32)

前几个值与上面输入的角度 theta 匹配,但之后值被包裹起来,因为 sincos 观测值模糊了相位信息。 unwrap() 函数的目的是从这种包裹的视图中恢复原始信号:

>>> jnp.unwrap(theta_out, period=360)
Array([ 76., 133., 179., 203., 230., 233., 239., 240., 255., 328., 386.,
       468., 513., 567., 654., 719., 775., 823., 873., 957.],      dtype=float32)

它通过假设真实的底层序列在单步内不超过 discont(默认为 period / 2),并且当遇到较大的不连续性时,它会将周期因子添加到数据中。对于满足此假设的周期信号,unwrap() 可以恢复原始相位信号。