2010-06-04 8 views
6

in Python, data una matrice n x p, ad es. 4 x 4, come posso restituire una matrice di 4 x 2 che fa semplicemente una media delle prime due colonne e delle ultime due colonne per tutte e 4 le righe della matrice?matricola mediamente

ad es. proposta:

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

restituisce una matrice con una media di [:, 0] e una [:, 1] e una media di [:, 2] e una [:, 3]. Voglio che funzioni per una matrice arbitraria di n x p assumendo che il numero di colonne che sto calcolando in media di n sia ovviamente equamente divisibile per n.

mi permetta di chiarire: per ogni riga, voglio prendere la media delle prime due colonne, quindi la media delle ultime due colonne. Quindi sarebbe:

1 + 2/2, 3 + 4/2 < - riga 1 della nuova matrice 5 + 6/2, 7 + 8/2 < - riga 2 di nuova matrice, ecc

che dovrebbe produrre una matrice 4 x 2 anziché 4 x 4.

grazie.

+0

vuoi una matrice 4x2, ma quello che descrivi (con un [:, 0], ecc. Suona come se fosse una matrice 1x4 –

risposta

1

È un po 'poco chiaro che cosa dovrebbe accadere per le matrici con n> 4, ma questo codice farà ciò che si vuole:

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 

Questo produce avg =

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

Ecco un modo per farlo . Devi solo cambiare groupsize per farlo funzionare con altre dimensioni come hai detto tu, anche se non sono completamente sicuro di quello che vuoi.

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

cede

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

per out. Spero che ti dia qualche idea su come fare esattamente quello che vuoi fare. Ad esempio, è possibile rendere il groupsize dipendente dalle dimensioni di a.

5

Che ne dici di usare un po 'di matematica? È possibile definire una matrice M = [[0.5,0],[0.5,0],[0,0.5],[0,0.5]] in modo che A*M sia ciò che si desidera.

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 

Generazione M è piuttosto semplice anche, le voci sono 1/n o pari a zero.

4

rimodellare - farsi dire - rimodellare

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

dovrebbe funzionare per qualsiasi dimensione della matrice, e rimodellare non fare una copia.

Problemi correlati