Подтвердить что ты не робот

Среднее значение числа единиц и дисперсия от одной функции?

Используя Numpy/Python, можно ли вернуть среднее значение AND из одного вызова функции?

Я знаю, что я могу делать их отдельно, но для вычисления стандартного отклонения выборки требуется среднее значение. Поэтому, если я использую отдельные функции для получения среднего значения и дисперсии, я добавляю ненужные служебные данные.

Я пробовал посмотреть на numpy docs здесь (http://docs.scipy.org/doc/numpy/reference/routines.statistics.html), но без успеха.

4b9b3361

Ответ 1

Вы не можете передать известное значение np.std или np.var, вам придется ждать новой стандартной библиотеки statistics, но тем временем вы можете сэкономить немного времени, используя формулу:

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

Ответ 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