python - sacar - ¿Diferencia media Y varianza de una sola función?
varianza percentiles (2)
También puede evitar la sustracción haciendo uso de la relación entre la media, la varianza y la potencia de una señal:
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
Usando Numpy / Python, ¿es posible devolver la varianza AND media de una llamada a una sola función?
Sé que puedo hacerlos por separado, pero se requiere la media para calcular la desviación estándar de la muestra. Entonces, si uso funciones separadas para obtener la media y la varianza, estoy agregando gastos generales innecesarios.
He intentado ver los documentos numpy aquí ( http://docs.scipy.org/doc/numpy/reference/routines.statistics.html ), pero sin éxito.
No puede pasar un medio conocido a np.std
o np.var
, tendrá que esperar al nuevo módulo de statistics
biblioteca estándar , pero mientras tanto puede ahorrar un poco de tiempo usando la fórmula:
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
Si realmente está tratando de acelerar las cosas, intente np.dot
para hacer la cuadratura y la suma (ya que eso es lo que es un producto de puntos):
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