2013-07-01 94 views
13

在numpy中,是否有計算多軸平均值的快速方法?我正在計算n維陣列的0軸上的所有平均值。獲取numpy數組的多個軸的平均值

我目前正在這樣做;

for i in range(d.ndim - 1): 
    d = d.mean(axis=1) 

我想知道是否有一個不使用python循環的解決方案。

回答

8

我的方法是重塑數組以平坦化所有較高維,然後在軸1上運行平均值。這是您要查找的內容嗎?

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

(第2步纔算高DIMS的長度的乘積)

+2

謝謝!另外,可以使用-1代替higher_dim。 – dsg101

+0

@ dsg101真棒!現在編輯! – acjay

0

從@ dsg101的建議繼,這是那種你想要的東西?

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

是的,我認爲這會比OP soln更快。 – dsg101

+0

'np.product(d.shape [1:])'更好拼寫'-1' – Eric

25

在numpy的1.7,你可以到np.mean給多軸:

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

我猜這將同樣執行其他提出的解決方案,除非重塑陣列拉平所有維度觸發副本數據,在這種情況下,這應該快得多。所以這可能會帶來更一致的表現。

+0

優秀!目前我在numpy 1.6上。 – dsg101

+0

我無法確認此功能是否存在,在版本1.7.1或版本1.8.2中都不存在。妄想? – j08lue

+0

你試過了嗎?它不起作用?它在1.7裏,相信我。對所有ufuncs進行了更改,所以它會自動傳播到所有函數,如'np.mean',這依賴於'np.add'。它沒有被添加到「mean」和其他類似函數的文檔中,儘管有[開放PR](https://github.com/numpy/numpy/pull/5146)來解決這個問題。但是你可以看一下[np.sum'](https://github.com/numpy/numpy/pull/5146)的文檔,這些文檔已經更新,並且在1.7版本中標記爲* New的相關更改。 0. * – Jaime

3

您還可以使用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]]])