【问题标题】:Python numpy unwrap functionPython numpy 解包函数
【发布时间】:2017-06-20 22:41:15
【问题描述】:

我希望将弧度数组转换为范围[0, 2*pi)numpy unwrap 函数正是我需要的

但是,当我运行以下代码输入a = [pi, 2*pi, 3*pi]时:

import numpy as np

a = np.array([np.pi, 2*np.pi, 3*np.pi])
np.unwrap(a)

我希望结果接近[pi, 0, pi]。但是,输出仍然是:

array([ 3.14159265,  6.28318531,  9.42477796])

它没有被打开。但是,如果我在不使用 numpy.pi

的情况下运行以下命令
a = np.array([3.14159265,  6.28318531,  9.42477796])
np.unwrap(a)

输出正确:

array([  3.14159265e+00,   2.82041412e-09,   3.14159265e+00])

发生了什么事?

【问题讨论】:

    标签: python python-2.7 numpy pi


    【解决方案1】:

    虽然接受的答案给了你想要的结果,但我认为它并没有触及问题的核心,如果我正确解释你的问题,你真的想要 wrap 你的阶段,而不是解开它。

    np.unwrap 在这种情况下工作的原因,对您的数据进行了微小的更改,实际上是np.unwrap 计算其结果的幼稚方式的结果;它只是在您的数据中查找局部不连续性并进行相应调整。以这种方式获得您正在寻找的结果是抽样错误的结果。换句话说,如果您通过插值得到a = np.array([np.pi, 3*np.pi/2, 2*np.pi, 5*np.pi/2, 3*np.pi]) 来改进采样,那么调整数据将不再起作用。

    一种更复杂的相位展开方法(例如傅里叶变换方法)将让您的数据展开,即使采样很差。

    如果您真的想将数据限制在[0, 2*pi)np.unwrap 是您想要的。我能想到的最简单的封装相位的方法是使用模运算符:

    import numpy as np
    
    a = np.array([np.pi, 2 * np.pi, 3 * np.pi])
    a_wrapped = a % (2 * np.pi)
    print (a_wrapped)
    

    当然,由于采样错误,np.unwrap(a_wrapped) 不会返回您原来的a,因此可能不清楚这是相反的。但是,如果您改进采样,它确实会返回原始的a

    import numpy as np
    
    a = np.arange(0, 4 * np.pi, np.pi/10)
    print (a)
    a_wrapped = a % (2 * np.pi)
    print (a_wrapped)
    a = np.unwrap(a_wrapped)
    print (a)
    

    【讨论】:

      【解决方案2】:

      取自 np.unwrap 文档:

      通过更改大于的绝对跳跃来展开弧度相位p discont 沿给定轴的 2*pi 补码。

      discont = np.pi 的位置(默认情况下)。当

      a = np.array([np.pi, 2*np.pi, 3*np.pi])
      

      a[1] - a[0] = np.pia[2] - a[1] = np.pi 的跳转不大于np.pi,因此没有“展开”。但是,如果

      a = np.array([3.14159265,  6.28318531,  9.42477796])
      

      您的a[1] - a[0] = 3.1415926600000001 大于np.pi,因此该函数会解开这些值。

      【讨论】:

      • 这只适用于采样错误(即数据稀疏),并不是真正解决实际问题的方法(我认为 OP 错误陈述了这一点)。您的答案包含与 OP 相同的语义错误,因此我猜您可能不知道该主题,只是从您可用的信息中找到了似乎合乎逻辑的解决方案。详情见我的回答。
      【解决方案3】:

      似乎有一个四舍五入的问题。两个测试用例不一样。

      a = np.array([np.pi, 2*np.pi, 3*np.pi])
      a1 = np.array([3.14159265,  6.28318531,  9.42477796])
      print('a ', ', '.join([str(i) for i in a]))
      print('a1', ', '.join([str(i) for i in a1]))
      
      a  3.14159265359, 6.28318530718, 9.42477796077   
      a1 3.14159265, 6.28318531, 9.42477796
      

      【讨论】:

        猜你喜欢
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        • 2016-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 2015-08-13
        相关资源
        最近更新 更多