比方說,我有一個包含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]
。
我該如何去做呢?
比方說,我有一個包含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]
。
我該如何去做呢?
試試這個列表理解:
b = [sum(a[current: current+5]) for current in xrange(0, len(a), 5)]
它採用5片在同一時間從列表,總結起來,構建一個列表。也適用於不是5的倍數的列表。
(xrange
應在python3 + range
)
你可以使用
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]))
的一種方法是使用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])
這裏的(還)另一種解決方案:
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
)進行整形,因此效率高,速度快。
能否再詳述一下? – user3397243 2015-04-01 13:23:43
但爲此,我需要更改每個新陣列的形狀! – user3397243 2015-04-01 13:26:45
Yup:如果陣列的長度不全相同,則需要計算此處使用的正確形狀:例如對於長度爲「k」的連續塊總結的長度爲「n」的數組,長度爲「(n // k,k)」的形狀應該是'(n // k,k)','n'最好能被「k」整除。 – xnx 2015-04-01 13:29:05
但我需要相同的更大的數組= len = 100!有沒有辦法擴展它? – user3397243 2015-04-01 13:29:51
該方法非常適用 - 您能否澄清您想要的更大陣列? – 2015-04-01 13:32:14
當我爲更大的陣列執行此操作時,我只能得到兩個值!但我需要20個值,因爲我的數組是len = 100 – user3397243 2015-04-01 13:34:52