2010-01-13 48 views
0

我想從一定大小的列表(或數組)中咬出一塊,返回該咬的平均值,然後繼續下一個咬,然後再重做一遍。有沒有辦法做到這一點,而不寫一個for循環?如何平均Python中列表的某些大小的子部分?

In [1]: import numpy as np 
In [2]: x = range(10) 
In [3]: np.average(x[:4]) 
Out[3]: 1.5 
In [4]: np.average(x[4:8]) 
Out[4]: 5.5 
In [5]: np.average(x[8:]) 
Out[5]: 8.5 

我正在尋找像,np.average(X [:bitesize = 4])返回:[1.5,5.5,8.5]。

我已經看過切片數組,並逐步通過數組,但我還沒有找到任何像我想要發生的事情。

+1

你爲什麼不想要寫一個for循環?當人們提出的問題試圖在沒有任何控制結構的情況下做某些事情時,這往往表明他們處於不幸的「儘可能以一條線」的心態。 如果您擔心的是性能,那麼請說出來,並舉例說明您正在處理的數據大小,以便人們知道要測試什麼。 – 2010-01-13 02:44:20

+0

我可以寫一個for循環,但是這和我爲循環編寫的許多其他列表或數組操作一樣,直到我找到可以逐步通過數組爲止。所以我問。 此外,我將寫入的for循環將聲明一個新列表,啓動一個for循環,運行if語句(或兩個),將值附加到我的新列表中,並可能更多。因此,一個人已經回答的for循環對於我來說是清晰的,在我的編程意義上是非悲劇的。 – JBWhitmore 2010-01-13 02:53:54

回答

5
[np.average(x[i:i+4]) for i in xrange(0, len(x), 4) ]
1

使用numpy的,你可以使用np.averageaxis關鍵字:

import numpy as np 
x=np.arange(12) 
y=x.reshape(3,4) 
print(y) 
# [[ 0 1 2 3] 
# [ 4 5 6 7] 
# [ 8 9 10 11]] 
print(np.average(y,axis=1)) 
# [ 1.5 5.5 9.5] 

注意,重塑x,我不得不做出x開始由組大小整除的長度(在此情況4)。

如果x的長度不能被組大小整除,那麼可以創建一個掩碼數組並使用np.ma.average來計算適當的平均值。

例如,

x=np.ma.arange(12) 
y=x.reshape(3,4) 
mask=(x>=10) 
y.mask=mask 
print(y) 
# [[0 1 2 3] 
# [4 5 6 7] 
# [8 9 -- --]] 
print(np.ma.average(y,axis=1)) 
# [1.5 5.5 8.5] 
+0

這實際上回答了我有過但尚未詢問的潛在面具陣列問題...... – JBWhitmore 2010-01-14 02:52:18