【问题标题】:Decimal precision in Python Scipy lfilter?Python Scipy lfilter中的小数精度?
【发布时间】:2015-10-23 07:54:39
【问题描述】:

有没有人知道 python (lfilter) 中的小数精度。 根据他们对 Matlab filter() 和 SciPy lfilter() 的文档,它们似乎应该是等价的。 我正在 matlab 和 python 中进行一些计算......不幸的是,我得到的结果不同,我不知道为什么?

作为输入,我使用相同的系数集:

b1 = np.array([0.987968850910341,  -1.975937701820681,   0.987968850910341]) 
a1 = np.array([1.000000000000000,  -1.975859694926928,   0.976015708714434])

以及以下python中的过滤器代码:

filtered = lfilter(b1, a1, signal_in, axis=0 )

在matlab中:

filtered = filter(b1, a1, signal_in)

但结果不同......来自matlab的结果是正确的。 不过小数点后第四位应该是一致的。

如果有任何建议,我将不胜感激。

问候

这是我的输入数据:

    108699371.346
108699354.081
108699336.818
108699319.553
108699302.288
108699285.023
108699267.757
108699250.494
108699233.231
108699215.969
108699198.707
108699181.443
108699164.18
108699146.917
108699129.654
108699112.393
108699095.133
108699077.872
108699060.611
108699043.351
108699026.091
108699008.832
108698991.572
108698974.312
108698957.053
108698939.794
108698922.536
108698905.274
108698888.014
108698870.754
108698853.494
108698836.234
108698818.976
108698801.719
108698784.462
108698767.205
108698749.95
108698732.693
108698715.436
108698698.179

【问题讨论】:

    标签: python filter scipy precision


    【解决方案1】:

    至少在我的系统上(scipy 0.16.0,Python 3.4.3,MATLAB r2014b,都是 64 位),结果是相同的。但是,MATLAB 和 numpy 以不同的方式显示它们。 numpy 默认将结果显示到小数点后 8 位,而 MATLAB 默认仅将结果显示到小数点后 4 位。但是,在内部,两者都有更多的精度位(都使用双精度浮点数,精度为 15-17 位小数)。

    如果我使用sprintf 将 MATLAB 结果显示到小数点后 8 位,则结果与 scipy 结果相同(使用逐个字符比较)。所以这并不是说 scipy 做错了什么,甚至在数值上没有任何不同,numpy 只是在显示浮点数方面与 MATLAB 有不同的默认值。

    那么 numpy 默认打印什么:

    array([  1.07391593e+08,   1.04799110e+08,   1.02252456e+08,
             9.97509288e+07,   9.72938364e+07,   9.48804965e+07,
             9.25102361e+07,   9.01823919e+07,   8.78963097e+07,
             8.56513445e+07,   8.34468604e+07,   8.12822305e+07,
             7.91568365e+07,   7.70700690e+07,   7.50213272e+07,
             7.30100186e+07,   7.10355593e+07,   6.90973734e+07,
             6.71948935e+07,   6.53275598e+07,   6.34948208e+07,
             6.16961327e+07,   5.99309594e+07,   5.81987724e+07,
             5.64990510e+07,   5.48312815e+07,   5.31949579e+07,
             5.15895811e+07,   5.00146595e+07,   4.84697083e+07,
             4.69542498e+07,   4.54678129e+07,   4.40099335e+07,
             4.25801542e+07,   4.11780240e+07,   3.98030987e+07,
             3.84549400e+07,   3.71331165e+07,   3.58372028e+07,
             3.45667795e+07])
    

    MATLAB 默认打印的内容:

    filtered =
    
        1.0e+08 *
    
        Columns 1 through 14
    
            1.0739    1.0480    1.0225    0.9975    0.9729    0.9488    0.9251    0.9018    0.8790    0.8565    0.8345    0.8128    0.7916    0.7707
    
        Columns 15 through 28
    
            0.7502    0.7301    0.7104    0.6910    0.6719    0.6533    0.6349    0.6170    0.5993    0.5820    0.5650    0.5483    0.5319    0.5159
    
        Columns 29 through 40
    
            0.5001    0.4847    0.4695    0.4547    0.4401    0.4258    0.4118    0.3980    0.3845    0.3713    0.3584    0.3457
    

    当我使用sprintf('%0.8e, ',filtered) 将 MATLAB 设置为使用 8 位精度时,MATLAB 会打印什么:

    1.07391593e+08, 1.04799110e+08, 1.02252456e+08, 9.97509288e+07, 9.72938364e+07, 9.48804965e+07, 9.25102361e+07, 9.01823919e+07, 8.78963097e+07, 8.56513445e+07, 8.34468604e+07, 8.12822305e+07, 7.91568365e+07, 7.70700690e+07, 7.50213272e+07, 7.30100186e+07, 7.10355593e+07, 6.90973734e+07, 6.71948935e+07, 6.53275598e+07, 6.34948208e+07, 6.16961327e+07, 5.99309594e+07, 5.81987724e+07, 5.64990510e+07, 5.48312815e+07, 5.31949579e+07, 5.15895811e+07, 5.00146595e+07, 4.84697083e+07, 4.69542498e+07, 4.54678129e+07, 4.40099335e+07, 4.25801542e+07, 4.11780240e+07, 3.98030987e+07, 3.84549400e+07, 3.71331165e+07, 3.58372028e+07, 3.45667795e+07, 
    

    scipy 和 MATLAB 结果集格式相同:

    scipy:  1.07391593e+08 1.04799110e+08 1.02252456e+08 9.97509288e+07 9.72938364e+07 9.48804965e+07 9.25102361e+07 9.01823919e+07 8.78963097e+07 8.56513445e+07 8.34468604e+07 8.12822305e+07 7.91568365e+07 7.70700690e+07 7.50213272e+07 7.30100186e+07 7.10355593e+07 6.90973734e+07 6.71948935e+07 6.53275598e+07 6.34948208e+07 6.16961327e+07 5.99309594e+07 5.81987724e+07 5.64990510e+07 5.48312815e+07 5.31949579e+07 5.15895811e+07 5.00146595e+07 4.84697083e+07 4.69542498e+07 4.54678129e+07 4.40099335e+07 4.25801542e+07 4.11780240e+07 3.98030987e+07 3.84549400e+07 3.71331165e+07 3.58372028e+07 3.45667795e+07 
    MATLAB: 1.07391593e+08 1.04799110e+08 1.02252456e+08 9.97509288e+07 9.72938364e+07 9.48804965e+07 9.25102361e+07 9.01823919e+07 8.78963097e+07 8.56513445e+07 8.34468604e+07 8.12822305e+07 7.91568365e+07 7.70700690e+07 7.50213272e+07 7.30100186e+07 7.10355593e+07 6.90973734e+07 6.71948935e+07 6.53275598e+07 6.34948208e+07 6.16961327e+07 5.99309594e+07 5.81987724e+07 5.64990510e+07 5.48312815e+07 5.31949579e+07 5.15895811e+07 5.00146595e+07 4.84697083e+07 4.69542498e+07 4.54678129e+07 4.40099335e+07 4.25801542e+07 4.11780240e+07 3.98030987e+07 3.84549400e+07 3.71331165e+07 3.58372028e+07 3.45667795e+07
    

    另外,scipy 过滤器不需要axis 参数,至少如果您使用向量(一维数组)。

    【讨论】:

    • 感谢您确认我发现我的错误的结果之间应该有一个协议。不必要地我做了一个中间步骤,它减少了十进制数。但现在它完美运行。
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多