2010-06-04 15 views
6

en Python, étant donné une matrice n x p, par ex. 4 x 4, comment puis-je retourner une matrice de 4 x 2 qui fait simplement la moyenne des deux premières colonnes et les deux dernières colonnes pour les 4 lignes de la matrice?moyennement la matrice efficacement

par exemple. suivant:

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

retourner une matrice qui a la moyenne de [:, 0] et un [:, 1] et la moyenne de [:, 2] et un [:, 3]. Je veux que cela fonctionne pour une matrice arbitraire de n x p en supposant que le nombre de colonnes que je moyennais de n est évidemment également divisible par n. Permettez-moi de clarifier: pour chaque ligne, je veux prendre la moyenne des deux premières colonnes, puis la moyenne des deux dernières colonnes. Il serait donc:

1 + 2/2, 3 + 4/2 < - rangée 1 de la nouvelle matrice 5 + 6/2, 7 + 8/2 < - la ligne 2 de nouvelle matrice, etc.

qui devrait donner une matrice 4 par 2 plutôt que 4 x 4.

merci.

+0

vous voulez une matrice 4x2, mais ce que vous décrivez (avec un [:, 0], etc.) sonne comme une matrice 1x4 –

Répondre

1

Il est un peu difficile de ce qui devrait se produire pour des matrices avec n> 4, mais ce code va faire ce que vous voulez:

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 

Cela donne avg =

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

Voici une façon de le faire . Vous avez seulement besoin de changer groupsize pour le faire fonctionner avec d'autres tailles comme vous l'avez dit, même si je ne suis pas tout à fait sûr de ce que vous voulez.

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

cède

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

pour out. J'espère que cela vous donnera quelques idées sur la façon de faire exactement ce que vous voulez faire. Vous pouvez faire groupsize en fonction des dimensions de a par exemple.

5

Que diriez-vous d'utiliser des maths? Vous pouvez définir une matrice M = [[0.5,0],[0.5,0],[0,0.5],[0,0.5]] de sorte que A*M est ce que vous voulez.

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 

Génération M est assez simple aussi, les entrées sont 1/n ou nul.

4

Reshape - Get mean - réorganisera

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

est censé travailler pour une taille de tableau, et ne fait pas remodeler une copie.