2011-05-22 101 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)中。