2013-07-01 5 views
13

In numpy gibt es eine schnelle Möglichkeit, den Mittelwert über mehrere Achsen zu berechnen? Ich berechne den Mittelwert für alle außer der 0-Achse eines n-dimensionalen Arrays.Ermitteln des Mittelwerts mehrerer Achsen eines nuepy Arrays

Ich mache das gerade;

for i in range(d.ndim - 1): 
    d = d.mean(axis=1) 

Ich frage mich, ob es eine Lösung gibt, die keine Python-Schleife verwendet.

Antwort

8

Mein Ansatz wäre, das Array neu zu formen, um alle höheren Dimensionen abzuflachen und dann den Mittelwert auf Achse 1 zu setzen. Ist das wonach Sie suchen?

In [14]: x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) 

In [16]: x.reshape((x.shape[0], -1)).mean(axis=1) 
Out[16]: array([ 2.5, 6.5]) 

(Schritt 2 berechnet nur das Produkt der Längen der höheren dimmt)

+2

Dank! Außerdem kann -1 anstelle von higher_dims verwendet werden. – dsg101

+0

@ dsg101 genial! Jetzt bearbeiten! – acjay

0

aus dem Vorschlag von @ dsg101 Im Anschluss an, das ist das, was Sie wollen?

>>> import numpy as np 
>>> d=np.reshape(np.arange(5*4*3),[5,4,3]) 
>>> d 
array([[[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]], 

     [[12, 13, 14], 
     [15, 16, 17], 
     [18, 19, 20], 
     [21, 22, 23]], 

     [[24, 25, 26], 
     [27, 28, 29], 
     [30, 31, 32], 
     [33, 34, 35]], 

     [[36, 37, 38], 
     [39, 40, 41], 
     [42, 43, 44], 
     [45, 46, 47]], 

     [[48, 49, 50], 
     [51, 52, 53], 
     [54, 55, 56], 
     [57, 58, 59]]]) 
>>> np.mean(np.reshape(d,[d.shape[0],np.product(d.shape[1:])]),axis=1) 
array([ 5.5, 17.5, 29.5, 41.5, 53.5]) 
+0

Ja, ich denke, das wäre schneller als die OP-Lösung. – dsg101

+0

'np.product (d.shape [1:])' 'ist besser buchstabiert' -1' – Eric

25

In numpy 1.7 Sie mehrachsige zu np.mean geben kann:

d.mean(axis=tuple(range(1, d.ndim))) 

ich das den anderen vorgeschlagenen Lösungen in ähnlicher Weise wird ausführen bin zu raten, es sei denn, das Array Umformung alle Dimensionen zu glätten löst eine Kopie die Daten, in diesem Fall sollte dies viel schneller sein. Dies wird wahrscheinlich zu einer konsistenteren Leistung führen.

+0

Ausgezeichnet! Momentan bin ich aber bei 1.6. – dsg101

+0

Ich kann nicht bestätigen, dass diese Funktion existiert, weder in Version 1.7.1 noch in Version 1.8.2 von numpy. Wunschdenken? – j08lue

+0

Haben Sie es versucht und es hat nicht funktioniert? Es war dort in 1.7, vertrau mir. Die Änderung wurde an allen ufuncs vorgenommen, so dass sie automatisch an alle Funktionen weitergegeben wurde, wie 'np.mean', die auf' np.add' angewiesen sind. Es wurde nicht zu den Dokumenten von 'mean' und anderen ähnlichen Funktionen hinzugefügt, obwohl es [eine offene PR] (https://github.com/numpy/numpy/pull/5146) gibt, um das zu beheben. Aber Sie können sich die [docs von 'np.sum'] (https://github.com/numpy/numpy/pull/5146) ansehen, die aktualisiert wurden und die relevante Änderung als * Neu in Version 1.7 markiert haben. 0. * – Jaime

3

Sie können auch numpy.apply_over_axes verwenden:

import numpy as np 

x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) 
y = np.apply_over_axes(np.mean, x, (1, 2)) 
y = array([[[ 2.5]],[[ 6.5]]]) 
Verwandte Themen