2012-05-09 17 views
8

Öğeleri 3 boyutlu olan bir Numpy 3 eksen dizilim var. Onları ortalamalamak ve dizinin aynı şeklini vermek isterim. Normal ortalama fonksiyonu 3 boyut kaldırır ve (beklendiği gibi) ortalama ile değiştirin:ortalama numpy dizisi ancak şekli koru

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

Sonuç gerekli:

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

Eğer zarif yapabilir veya sadece yinelemek zorunda yapabilir Python'daki dizi üzerinde (güçlü bir Numpy işlevine kıyasla çok daha yavaş olacak).

np.mean işlevi için Dtype bağımsız değişkeni belki de 1D dizisine ayarlayabilir misiniz?

Teşekkürler.

+2

Büyük fan için eksendir ndimentional dizidir. – lukecampbell

+0

Çoğu durumda, hayal edebiliyorum, 3d dizi gerektirmeden yayın yapacak. – tillsten

cevap

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

Bu neden azalıyor? – AJP

6

Ok, DİKKAT Henüz numpyology benim ustaları yok, ama sadece uğraşırken, ben ile geldi:

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

Hoşuma gitti, bu benim ortaya koyduğumdan daha iyi. – lukecampbell

+0

Bu iyi çalışıyor ... Lobster veya Bago'nun cevapları üzerinde herhangi bir avantaj var mı? – AJP

+0

Bu bir satırdır ve son eksen boyunca ortalamayı aldığınız sürece tüm dizi şekilleri ve boyutları için çalışır. – user545424

5

Eğer yayın kullanmayı düşündünüz mü? Here, kavram konusunda yeniyseniz yayın hakkında daha fazla bilgi edinebilirsiniz.

İşte
>>> 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

Bu harika bir bağlantı, teşekkürler. – AJP

+0

Ve de iyi bir cevap. – AJP

1

: İşte

broadcast_arrays kullanarak bir örnek, bunu yazmak için isterseniz bir kopyasını almalısınız, salt okunur olarak broadcast_arrays burada üretilen b tedavi edilmesi gerektiğini akılda tutmak yapma kopyalarını kaçınan bir yöntem:

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

Yoksa üzerine yazmak istemiyorsanız a:

+0

Ve başka harika bir cevap. Nasıl seçerim? Teşekkürler! :) – AJP

0

Bukeyfi bir eksen içindir:

array ve axis ortalama

söz konusu görmek istiyorum ne
np.repeat(np.expand_dims(np.mean(array, axis), axis), array.shape[axis], axis)