2015-04-01 33 views
3

比方說,我有一個包含10個值的numpy數組a。只是在這裏的示例的情況下,雖然我想和長度重複相同的一個陣列100在NumPy數組中連續值的總和

a = np.array([1,2,3,4,5,6,7,8,9,10]) 

我想總結第一5個值,然後第二個5個值等,並將它們存儲在一個新的空列表說b

所以b將包含b = [15,40]

我該如何去做呢?

回答

2

試試這個列表理解:

b = [sum(a[current: current+5]) for current in xrange(0, len(a), 5)] 

它採用5片在同一時間從列表,總結起來,構建一個列表。也適用於不是5的倍數的列表。

xrange應在python3 + range

1

你可以使用

import numpy as np 

a = np.array([1,2,3,4,5,6,7,8,9,10]) 
step = 5 

for i in range(0,a.shape[0],step): 
    print(np.sum(a[i:i+step])) 
8

的一種方法是使用add ufunc其reduceat方法:

>>> np.add.reduceat(a, [0,5]) 
array([15, 40]) 

這求和片a[0:5]a[5:]並返回一個新的數組。

如果你想要一個Python列表,你可以在返回的數組上調用tolist()

您可以使用該方法的任何索引列表(並且它們不必均勻間隔)。例如,如果你想長度爲100的陣列上的每個時間的5片:

>>> b = np.arange(100) 
>>> np.add.reduceat(b, range(0, 100, 5)) 
array([ 10, 35, 60, 85, 110, 135, 160, 185, 210, 235, 260, 285, 310, 
    335, 360, 385, 410, 435, 460, 485]) 
+0

但我需要相同的更大的數組= len = 100!有沒有辦法擴展它? – user3397243 2015-04-01 13:29:51

+0

該方法非常適用 - 您能否澄清您想要的更大陣列? – 2015-04-01 13:32:14

+0

當我爲更大的陣列執行此操作時,我只能得到兩個值!但我需要20個值,因爲我的數組是len = 100 – user3397243 2015-04-01 13:34:52

3

這裏的(還)另一種解決方案:

In [3]: a.reshape((2,5)).sum(axis=1) 
Out[3]: array([15, 40]) 

的一維陣列重塑至5兩排列和求和的列:

In [4]: a.reshape((2,5)) 
Out[4]: 
array([[ 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10]]) 

沿每一行的總和(求和列條目)與axis=1指定。在不復制數據的情況下(並且不修改原始文件a)進行整形,因此效率高,速度快。

+0

能否再詳述一下? – user3397243 2015-04-01 13:23:43

+0

但爲此,我需要更改每個新陣列的形狀! – user3397243 2015-04-01 13:26:45

+0

Yup:如果陣列的長度不全相同,則需要計算此處使用的正確形狀:例如對於長度爲「k」的連續塊總結的長度爲「n」的數組,長度爲「(n // k,k)」的形狀應該是'(n // k,k)','n'最好能被「k」整除。 – xnx 2015-04-01 13:29:05