2016-04-04 7 views
1

Есть ли способ для векторизации функции, чтобы выход был массивом значений, где каждое среднее означает среднее значений из 0-индекса входного массива? Цикл это довольно просто, но я стараюсь быть максимально эффективным. например 0 = среднее значение (0), 1 = среднее (0-1), N = среднее (0-N)векторизовать среднее число на срезах массива

+0

Что такое «0-индекс» массива в этом контексте? – HeinzKurt

+0

начало массива – Seth

+0

Любопытно, если одно из решений, размещенных здесь, работает для вас? – Divakar

ответ

3

Предполагаемая операция может быть придумана как cumulative averaging. Таким образом, очевидное решение будет включать cumulative summation и деление этих суммирования на число элементов, участвующих в каждом таком суммировании. Таким образом, векторизация реализация предполагает np.cumsum и последующим делением на количество участвующих элементов, которые могут быть получены с np.arange и обобщенным для ndarray, как так -

def cummean(A,axis): 
    """ Cumulative averaging 

    Parameters 
    ----------  
    A : input ndarray 
    axis : axis along which operation is to be performed 

    Output 
    ------  
    Output : Cumulative averages along the specified axis of input ndarray 
    """ 

    return np.true_divide(A.cumsum(axis),np.arange(1,A.shape[axis]+1)) 
2

Если вы можете использовать pandas есть expanding_mean который будет работать непосредственно с массивом NumPy:

In [10]: pandas.expanding_mean(np.arange(1, 11)) 
Out[10]: array([ 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5]) 

Этот метод также работает столбцы:

In [11]: A = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
         [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]).T 

In [12]: A 
Out[12]: 
array([[ 1, 1], 
     [ 2, 1], 
     [ 3, 1], 
     [ 4, 1], 
     [ 5, 1], 
     [ 6, 1], 
     [ 7, 1], 
     [ 8, 1], 
     [ 9, 1], 
     [10, 1]]) 

In [13]: pandas.expanding_mean(A) 
Out[13]: 
array([[ 1. , 1. ], 
     [ 1.5, 1. ], 
     [ 2. , 1. ], 
     [ 2.5, 1. ], 
     [ 3. , 1. ], 
     [ 3.5, 1. ], 
     [ 4. , 1. ], 
     [ 4.5, 1. ], 
     [ 5. , 1. ], 
     [ 5.5, 1. ]]) 
Смежные вопросы