2012-05-09 119 views
8

我有一個Numpy 3軸陣列,其元素是三維的。我想平均他們並返回相同的陣列形狀。正常的平均函數刪除的3個維度,並與平均更換(如預期):平均numpy數組,但保留形狀

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

結果所需

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

你能做到這一點優雅或者我只需要遍歷在Python中的數組(這將比強大的Numpy函數慢很多)。

您可以將np.mean函數的Dtype參數設置爲1D數組嗎?

謝謝。

+2

的你想在這個問題,看看有什麼大風扇。 – lukecampbell

+0

在大多數情況下,我可以想象,廣播將不需要3D數組。 – tillsten

回答

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

爲什麼這會得到downvoted? – AJP

6

好吧,注意我沒有我在numpyology的主人還沒有,但只是在玩的時候,我想出了:

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

我喜歡它,這比我想出的要好。 – lukecampbell

+0

這個效果很好....比龍蝦或Bago的答案有什麼優勢? – AJP

+0

這是一條線,只要沿着最後一個軸取平均值,它就適用於所有陣列形狀和大小。 – user545424

5

你有沒有考慮過用廣播? Here是關於廣播的更多信息,如果你對這個概念不熟悉的話。

下面是使用broadcast_arrays一個例子,請記住,通過broadcast_arrays這裏生產的b只讀應及時治療,你應該做一個副本,如果你想要寫它:

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

這是一個輝煌的鏈接,謝謝。 – AJP

+0

也是一個很好的答案。 – AJP

1

這裏避免複印的方法:

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

或者,如果你不想覆蓋a

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

另一個很好的答案。我該如何選擇?謝謝! :) – AJP

0

這是一個任意軸:

array是ndimentional陣列 和axis是軸平均

np.repeat(np.expand_dims(np.mean(array, axis), axis), array.shape[axis], axis) 
相關問題