2013-07-01 2 views

Répondre

8

Mon approche serait de remodeler le tableau pour aplatir toutes les dimensions supérieures et ensuite exécuter la moyenne sur l'axe 1. Est-ce ce que vous cherchez?

In [14]: x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) 

In [16]: x.reshape((x.shape[0], -1)).mean(axis=1) 
Out[16]: array([ 2.5, 6.5]) 

(étape 2 calcule simplement le produit des longueurs des DiMS plus élevées)

+2

Merci! De plus, -1 peut être utilisé à la place de higher_dims. – dsg101

+0

@ dsg101 génial! Modification maintenant! – acjay

0

Dans la continuité de la suggestion de @ dsg101, est-ce le genre de chose que vous voulez?

>>> import numpy as np 
>>> d=np.reshape(np.arange(5*4*3),[5,4,3]) 
>>> d 
array([[[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]], 

     [[12, 13, 14], 
     [15, 16, 17], 
     [18, 19, 20], 
     [21, 22, 23]], 

     [[24, 25, 26], 
     [27, 28, 29], 
     [30, 31, 32], 
     [33, 34, 35]], 

     [[36, 37, 38], 
     [39, 40, 41], 
     [42, 43, 44], 
     [45, 46, 47]], 

     [[48, 49, 50], 
     [51, 52, 53], 
     [54, 55, 56], 
     [57, 58, 59]]]) 
>>> np.mean(np.reshape(d,[d.shape[0],np.product(d.shape[1:])]),axis=1) 
array([ 5.5, 17.5, 29.5, 41.5, 53.5]) 
+0

Oui, je pense que ce serait plus rapide que le sol OP. – dsg101

+0

'np.product (d.shape [1:])' est mieux orthographié '-1' – Eric

25

En numpy 1.7, vous pouvez donner plusieurs axes à np.mean:

d.mean(axis=tuple(range(1, d.ndim))) 

Je devine que cela est semblable à celui des autres solutions proposées, à moins que le remodelage de la matrice pour aplatir toutes les dimensions déclenche une copie les données, auquel cas cela devrait être beaucoup plus rapide. Donc, cela va probablement donner une performance plus cohérente.

+0

Excellent! Je suis actuellement sur Numpy 1.6. – dsg101

+0

Je ne peux pas confirmer que cette fonctionnalité existe, ni dans la version 1.7.1 ni dans la version 1.8.2 de numpy. Vœu pieux? – j08lue

+0

L'avez-vous essayé et cela n'a pas fonctionné? Il était là en 1.7, croyez-moi. La modification a été apportée à tous les ufuncs, donc elle s'est propagée automatiquement à toutes les fonctions, comme 'np.mean', qui repose sur' np.add'. Il n'a pas été ajouté aux docs de 'mean' et autres fonctions similaires, bien qu'il y ait [un PR ouvert] (https://github.com/numpy/numpy/pull/5146) pour résoudre ce problème. Mais vous pouvez jeter un oeil à [les documents de 'np.sum'] (https://github.com/numpy/numpy/pull/5146) qui ont été mis à jour et ont le changement pertinent marqué comme * Nouveau dans la version 1.7. 0. * – Jaime

3

Vous pouvez également utiliser numpy.apply_over_axes:

import numpy as np 

x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) 
y = np.apply_over_axes(np.mean, x, (1, 2)) 
y = array([[[ 2.5]],[[ 6.5]]]) 
Questions connexes