【问题标题】:Numpy mean AND variance from single function?单个函数的 Numpy 均值和方差?
【发布时间】:2013-10-23 20:14:28
【问题描述】:

使用 Numpy/Python,是否可以从单个函数调用中返回均值和方差?

我知道我可以分开做,但是计算样本标准差需要平均值。因此,如果我使用单独的函数来获取均值和方差,则会增加不必要的开销。

我已尝试查看此处的 numpy 文档 (http://docs.scipy.org/doc/numpy/reference/routines.statistics.html),但没有成功。

【问题讨论】:

  • 为什么不直接使用 numpy.std?或者你想计算标准偏差以外的东西?

标签: python numpy


【解决方案1】:

我不认为 N​​umPy 提供了返回均值和方差的函数。

但是,SciPy 提供了函数scipy.stats.norm.fit(),它返回样本的均值和标准差。该函数以其将正态分布拟合到样本的更具体目的而命名。

例子:

>>> import scipy.stats
>>> scipy.stats.norm.fit([1,2,3])
(2.0, 0.81649658092772603)

请注意,fit() 不适用于标准偏差 Bessel's correction,因此如果您想要进行校正,则必须乘以适当的因子。

【讨论】:

    【解决方案2】:

    您还可以通过利用信号的均值、方差和功率之间的关系来避免减法:

    In [7]: import numpy as np
    
    In [8]: a = np.random.rand(1000)
    
    In [9]: %%timeit
       ...: a.mean()
       ...: a.var()
       ...: 
    10000 loops, best of 3: 24.7 us per loop
    
    In [10]: %%timeit
        ...: m = a.mean()
        ...: np.mean((a-m)**2)
        ...: 
    100000 loops, best of 3: 18.5 us per loop
    
    In [11]: %%timeit
        ...: m = a.mean()
        ...: power = np.mean(a ** 2)
        ...: power - m ** 2
        ...: 
    100000 loops, best of 3: 17.3 us per loop
    
    In [12]: %%timeit
        ...: m = a.mean()
        ...: power = np.dot(a, a) / a.size
        ...: power - m ** 2
        ...: 
    100000 loops, best of 3: 9.16 us per loop
    

    【讨论】:

      【解决方案3】:

      您无法将已知平均值传递给np.stdnp.var,您必须等待new standard library statistics module,但同时您可以使用以下公式节省一点时间:

      In [329]: a = np.random.rand(1000)
      
      In [330]: %%timeit
         .....: a.mean()
         .....: a.var()
         .....: 
      10000 loops, best of 3: 80.6 µs per loop
      
      In [331]: %%timeit
         .....: m = a.mean()
         .....: np.mean((a-m)**2)
         .....: 
      10000 loops, best of 3: 60.9 µs per loop
      
      In [332]: m = a.mean()
      
      In [333]: a.var()
      Out[333]: 0.078365856465916137
      
      In [334]: np.mean((a-m)**2)
      Out[334]: 0.078365856465916137
      

      如果您真的想加快速度,请尝试 np.dot 进行平方和求和(因为这就是点积):

      In [335]: np.dot(a-m,a-m)/a.size
      Out[335]: 0.078365856465916137
      
      In [336]: %%timeit
         .....: m = a.mean()
         .....: c = a-m
         .....: np.dot(c,c)/a.size
         .....: 
      10000 loops, best of 3: 38.2 µs per loop
      

      【讨论】:

      猜你喜欢
      • 2017-03-04
      • 2015-09-18
      • 2020-04-15
      • 2021-12-19
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      相关资源
      最近更新 更多