我有一个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