2016-04-04 13 views
1

Gibt es eine Möglichkeit, eine Funktion zu vektorisieren, so dass die Ausgabe ein Array von Mitteln wäre, wobei jeder Mittelwert den Mittelwert der Werte von 0-Index des Eingangsarrays darstellt? Das zu schleifen ist ziemlich einfach, aber ich versuche so effizient wie möglich zu sein. z.B. 0 = Mittelwert (0), 1 = Mittelwert (0-1), n ​​= Mittelwert (0-N)vectorize numpy Mittelwert über die Scheiben eines Arrays

+0

Was ist der "0-Index" eines Arrays in diesem Kontext? – HeinzKurt

+0

der Anfang des Arrays – Seth

+0

Neugierig, wenn eine der hier aufgeführten Lösungen für Sie arbeiten? – Divakar

Antwort

3

der beabsichtigte Betrieb könnte als cumulative averaging geprägt. Eine naheliegende Lösung würde daher cumulative summation beinhalten und diese Summierungen durch die Anzahl von Elementen teilen, die für jede derartige Summierung teilnehmen. Somit würde eine vektorisierte Implementierung np.cumsum einzubeziehen und dann durch die Anzahl der beteiligten Elemente Teilung, die mit np.arange und verallgemeinert für eine ndarray erhalten werden konnte, wie so -

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

Wenn Sie in der Lage sind pandas dort zu verwenden, ist expanding_mean die arbeiten direkt mit einem NumPy Array:

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]) 

Diese Methode funktioniert auch spaltenweise:

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. ]])