2012-05-09 14 views
8

Possiedo un array a 3 assi Numpy i cui elementi sono tridimensionali. Mi piacerebbe fare una media e restituire la stessa forma della matrice. La funzione di media normale rimuove le 3 dimensioni e sostituirlo con la media (come previsto):array numpy medio ma mantiene la forma

a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]], 
       [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32) 

b = np.average(a, axis=2) 
# b = [[0.2, 0.3], 
#  [0.4, 0.7]] 

risultato richiesto:

# b = [[[0.2, 0.2, 0.2], [0.3, 0.3, 0.3]], 
#  [[0.4, 0.4, 0.4], [0.7, 0.7, 0.7]]] 

Puoi farlo con eleganza o fare mi resta che iterare sopra l'array in Python (che sarà molto più lento rispetto a una potente funzione Numpy).

È possibile impostare l'argomento Dtype, per la funzione np.mean, su un array 1D?

Grazie.

+2

Grande appassionato di ciò che si vuole vedere nella questione. – lukecampbell

+0

Nella maggior parte dei casi posso immaginare, la trasmissione lo farà senza richiedere array 3d. – tillsten

risposta

3
>>> import numpy as np 
>>> a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]], 
...    [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32) 
>>> b = np.average(a, axis=2) 
>>> b 
array([[ 0.2  , 0.29999998], 
     [ 0.40000001, 0.69999999]], dtype=float32) 
>>> c = np.dstack((b, b, b)) 
>>> c 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

Perché questo viene downvoted? – AJP

6

Ok, ATTENZIONE Non ho i miei padroni in numpyology ancora, ma solo giocando intorno, mi si avvicinò con:

>>> np.average(a,axis=-1).repeat(a.shape[-1]).reshape(a.shape) 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

Mi piace, è meglio di quello che mi è venuto in mente. – lukecampbell

+0

Funziona bene ... qualche vantaggio rispetto alle risposte di Lobster o Bago? – AJP

+0

È una riga e funziona per tutte le forme e le dimensioni dell'array purché si assuma la media lungo l'ultimo asse. – user545424

5

Avete pensato di utilizzare la trasmissione? Here è più informazioni sulla trasmissione se sei nuovo al concetto.

Ecco un esempio di utilizzo broadcast_arrays, tenere a mente che il b prodotta qui da broadcast_arrays devono essere trattati in sola lettura, si dovrebbe fare una copia, se si vuole scrivere ad esso:

>>> b = np.average(a, axis=2)[:, :, np.newaxis] 
>>> b, _ = np.broadcast_arrays(b, a) 
>>> b 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

Questo è un collegamento geniale, grazie. – AJP

+0

E una buona risposta anche. – AJP

1

Ecco un metodo che evita l'esecuzione di copie:

a = a.T 
a[:] = a.mean(axis=0) 
a = a.T 

Oppure, se non si desidera sovrascrivere a:

b = np.empty_like(a) 
b = b.T 
b[:] = a.mean(axis=-1).T 
b = b.T 
+0

E un'altra grande risposta. Come scelgo ?! Grazie! :) – AJP

0

Si tratta di un asse arbitrario:

array è la matrice ndimentional e axis è l'asse di media

np.repeat(np.expand_dims(np.mean(array, axis), axis), array.shape[axis], axis)