我有一個2d數組,A是6x6。我想要取前兩個值(索引0,0和0,1)並取兩者的平均值並將平均值插入一個新數組,該索引是索引0,0處A(6x3)列大小的一半。然後我會得到A的下兩個索引,取平均值,並將它放入0,1的新數組中。python numpy數組切片
我知道該怎麼做,這是使用雙for循環的唯一方法,但是對於性能的目的(我將使用數組一樣大3000x3000),我知道有一個更好的解決方案在那裏!謝謝!
我有一個2d數組,A是6x6。我想要取前兩個值(索引0,0和0,1)並取兩者的平均值並將平均值插入一個新數組,該索引是索引0,0處A(6x3)列大小的一半。然後我會得到A的下兩個索引,取平均值,並將它放入0,1的新數組中。python numpy數組切片
我知道該怎麼做,這是使用雙for循環的唯一方法,但是對於性能的目的(我將使用數組一樣大3000x3000),我知道有一個更好的解決方案在那裏!謝謝!
一個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。
謝謝,這正是我一直在尋找的!我會更多地關注這些numpy功能。 – 2011-05-22 20:35:20
我不認爲這是一個更好的解決方案,除非您有什麼在這些陣列一些額外的信息。如果它們只是隨機數,則必須進行(n^2)/ 2計算,並且您的算法反映出,運行在O((n^2)/ 2)中。
如果你這樣做的話,結果會不會是數組(6x3)? – talonmies 2011-05-22 19:54:41
是的,我意識到這一點。謝謝! – 2011-05-22 20:05:23
如果你想加快numpy數組的運算速度,可以看看[Cython](http://cython.org/)。 – 2011-05-22 20:17:47