2010-06-04 9 views
6

en Python, dada una matriz n x p, p. 4 x 4, ¿cómo puedo devolver una matriz de 4 x 2 que simplemente promedia las primeras dos columnas y las dos últimas columnas para las 4 filas de la matriz?matriz promediadora eficazmente

p. Ej. dado:

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

devuelve una matriz que tiene el promedio de un [:, 0] y un [:, 1] y el promedio de un [:, 2] y un [:, 3]. Quiero que esto funcione para una matriz arbitraria de n x p, suponiendo que el número de columnas que estoy promediando de n es obviamente divisible por n.

déjenme aclarar: para cada fila, quiero tomar el promedio de las dos primeras columnas, luego el promedio de las dos últimas columnas. Así que sería:

1 + 2/2, 3 + 4/2 < - fila 1 de nueva matriz 5 + 6/2, 7 + 8/2 < - fila 2 de nueva matriz, etc.

que debería producir una matriz de 4 por 2 en lugar de 4 x 4.

gracias.

+0

quieres una matriz de 4x2, pero lo que describes (con un [:, 0], etc.) parece que será una matriz de 1x4 –

Respuesta

1

Es un poco confuso lo que debe suceder para matrices con n> 4, pero este código va a hacer lo que quiere:

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 

Esto produce avg =

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

Aquí está una manera de hacerlo . Solo necesita cambiar groupsize para que funcione con otros tamaños como usted dijo, aunque no estoy completamente seguro de lo que quiere.

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

produce

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

para out. Con suerte, le da algunas ideas sobre cómo hacer exactamente lo que quiere hacer. Puede hacer que groupsize dependa de las dimensiones de a, por ejemplo.

5

¿Qué le parece usar algunas matemáticas? Puede definir una matriz M = [[0.5,0],[0.5,0],[0,0.5],[0,0.5]] para que A*M sea lo que desea.

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 

Generación M es bastante simple también, las entradas son 1/n o cero.

4

reshape - conseguir decir - remodelar

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

se supone que funciona para cualquier tamaño de la matriz, y remodelar no hace una copia.

Cuestiones relacionadas