2011-05-22 197 views
1

我有一個2d數組,A是6x6。我想要取前兩個值(索引0,0和0,1)並取兩者的平均值並將平均值插入一個新數組,該索引是索引0,0處A(6x3)列大小的一半。然後我會得到A的下兩個索引,取平均值,並將它放入0,1的新數組中。python numpy數組切片

我知道該怎麼做,這是使用雙for循環的唯一方法,但是對於性能的目的(我將使用數組一樣大3000x3000),我知道有一個更好的解決方案在那裏!謝謝!

+0

如果你這樣做的話,結果會不會是數組(6x3)? – talonmies 2011-05-22 19:54:41

+0

是的,我意識到這一點。謝謝! – 2011-05-22 20:05:23

+0

如果你想加快numpy數組的運算速度,可以看看[Cython](http://cython.org/)。 – 2011-05-22 20:17:47

回答

10

一個numpy的陣列非常有用的功能是,它們可以被重新塑造,在許多不同的方式觀看,並通過這樣做,可以使某些操作非常容易。

既然要配對每兩個項目,是有意義的6x6的陣列重塑成一個18×2陣列:

import numpy as np 

arr=np.arange(36).reshape(6,6) 
print(arr) 
# [[ 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]] 
arr2=arr.reshape(-1,2) 
print(arr2) 
# [[ 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]] 

現在取平均值很簡單:

means=arr2.mean(axis=1) 
print(means) 
# [ 0.5 2.5 4.5 6.5 8.5 10.5 12.5 14.5 16.5 18.5 20.5 22.5 
# 24.5 26.5 28.5 30.5 32.5 34.5] 

最後,我們只是重塑陣列是6X3:

means=means.reshape(6,-1) 
print(means) 
# [[ 0.5 2.5 4.5] 
# [ 6.5 8.5 10.5] 
# [ 12.5 14.5 16.5] 
# [ 18.5 20.5 22.5] 
# [ 24.5 26.5 28.5] 
# [ 30.5 32.5 34.5]] 

,或者是1個襯墊:

means=arr.reshape(-1,2).mean(axis=1).reshape(6,-1) 

PS:reshaping是一個非常快速的操作,因爲它返回的是視圖,而不是原始數組的副本。所有改變的是尺寸和步伐。剩下的只是對mean方法的一次調用。因此,這個解決方案應該儘可能快地使用numpy。

+0

謝謝,這正是我一直在尋找的!我會更多地關注這些numpy功能。 – 2011-05-22 20:35:20

1

我不認爲這是一個更好的解決方案,除非您有什麼在這些陣列一些額外的信息。如果它們只是隨機數,則必須進行(n^2)/ 2計算,並且您的算法反映出,運行在O((n^2)/ 2)中。