2016-10-29 4 views
2

Die numper mittlere Funktion funktioniert einwandfrei, wenn die Abmessungen gleich sind.numpy.mean bei variierender Zeilengröße

a = np.array([[1, 2], [3, 4]]) 
a.mean(axis=1) 
array([ 1.5, 3.5]) 

Aber wenn ich es mit varrying Zeilengröße zu tun gibt es einen Fehler

a = np.array([[1, 2], [3, 4, 5]]) 
a.mean(axis=1) 
IndexError: tuple index out of range 

ich nichts auf der Dokumentation zu diesem Problem finden kann. Ich könnte das Mittel selbst berechnen, aber ich würde gerne die eingebaute Funktion dafür verwenden, da es möglich ist.

+0

Die zweite Fall eine 1D-Array von Objekten , Listen. Es zu einem Array zu machen macht nicht viel. Sie oder numpy müssen es immer noch als Liste von Listen behandeln. – hpaulj

Antwort

1

Hier ist ein Ansatz -

# Store length of each subarray 
lens = np.array(map(len,a)) 

# Generate IDs based on the lengths 
IDs = np.repeat(np.arange(len(lens)),lens) 

# Use IDs to do bin-based summing of a elems and divide by subarray lengths 
out = np.bincount(IDs,np.concatenate(a))/lens 

Probelauf -

In [34]: a # Input array 
Out[34]: array([[1, 2], [3, 4, 5]], dtype=object) 

In [35]: lens = np.array(map(len,a)) 
    ...: IDs = np.repeat(np.arange(len(lens)),lens) 
    ...: out = np.bincount(IDs,np.concatenate(a))/lens 
    ...: 

In [36]: out # Average output 
Out[36]: array([ 1.5, 4. ]) 

Einfachere alternative Art und Weise unter Verwendung Liste Verständnis -

In [38]: [np.mean(i) for i in a] 
Out[38]: [1.5, 4.0] 
+0

Das macht genau das, was benötigt wird, aber ist das wirklich der einfachste Weg, dies zu erreichen? – NicolaiF

+0

@NicolaiF Dafür können wir 'Listenverständnis' verwenden, wie es mit den Änderungen hinzugefügt wurde. – Divakar

+0

Danke für die umfassende Antwort! – NicolaiF

Verwandte Themen