2010-06-04 13 views
6

in Python, gegeben eine n x p-Matrix, z. 4 x 4, wie kann ich eine Matrix zurückgeben, die 4 x 2 ist, die einfach die ersten zwei Spalten und die letzten zwei Spalten für alle 4 Zeilen der Matrix mittelt?Mittelwertbildung effizient

z.B. gegeben:

a = array ([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15 , 16]])

geben Sie eine Matrix zurück, die den Durchschnitt von [:, 0] und a [:, 1] und den Durchschnitt von [:, 2] und a [:, 3] enthält. Ich möchte, dass dies für eine beliebige Matrix von n x p funktioniert, unter der Annahme, dass die Anzahl der Spalten, von denen ich Mittelwerte n bin, offensichtlich durch n teilbar ist.

lassen Sie mich klären: für jede Zeile möchte ich den Durchschnitt der ersten beiden Spalten, dann den Durchschnitt der letzten beiden Spalten. So wäre es:

1 + 2/2, 3 + 4/2 < - Zeile 1 der neuen Matrix 5 + 6/2, 7 + 8/2 < - Zeile 2 der neuen Matrix usw.

was eine 4 mal 2 Matrix statt 4 x 4 ergeben sollte.

danke.

+0

Sie wollen eine 4x2-Matrix, aber was Sie beschreiben (mit einem [:, 0] usw.) klingt wie eine 1x4-Matrix –

Antwort

1

Es ist ein wenig unklar, was für Matrizen mit n> 4 passieren sollte, aber dieser Code wird tun, was Sie wollen:

a = N.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], dtype=float) 
avg = N.vstack((N.average(a[:,0:2], axis=1), N.average(a[:,2:4], axis=1))).T 

Diese avg =

array([[ 1.5, 3.5], 
     [ 5.5, 7.5], 
     [ 9.5, 11.5], 
     [ 13.5, 15.5]]) 
1

Hier ergibt sich eine Möglichkeit, es zu tun . Sie müssen nur groupsize ändern, damit es mit anderen Größen wie Sie gesagt funktioniert, obwohl ich nicht ganz sicher bin, was Sie wollen.

groupsize = 2 
out = np.hstack([np.mean(x,axis=1,out=np.zeros((a.shape[0],1))) for x in np.hsplit(a,groupsize)]) 

ergibt

array([[ 1.5, 3.5], 
    [ 5.5, 7.5], 
    [ 9.5, 11.5], 
    [ 13.5, 15.5]]) 

für out. Hoffentlich gibt es Ihnen einige Ideen, wie Sie genau das machen können, was Sie tun möchten. Sie können groupsize abhängig von den Abmessungen von a zum Beispiel machen.

5

Wie wäre es mit etwas Mathe? Sie können eine Matrix M = [[0.5,0],[0.5,0],[0,0.5],[0,0.5]] so definieren, dass A*M ist was Sie wollen.

from numpy import array, matrix 

A = array([[1, 2, 3, 4], 
      [5, 6, 7, 8], 
      [9, 10, 11, 12], 
      [13, 14, 15, 16]]) 
M = matrix([[0.5,0], 
      [0.5,0], 
      [0,0.5], 
      [0,0.5]]) 
print A*M 

Generierung von M ist ziemlich einfach auch Einträge sind 1/n oder Null.

4

reshape - bedeuten bekommen - umformen

>>> a.reshape(-1, a.shape[1]//2).mean(1).reshape(a.shape[0],-1) 
array([[ 1.5, 3.5], 
     [ 5.5, 7.5], 
     [ 9.5, 11.5], 
     [ 13.5, 15.5]]) 

sollte für jede Array-Größe arbeiten, und umformen keine Kopie machen.