python numpy 数组切片
我有一个6x6的二维数组A。我想取前两个值(也就是位置0,0和0,1),计算这两个值的平均数,然后把这个平均数放到一个新的数组里,这个新数组的列数是A的一半(也就是6x3),放在位置0,0。接着,我会继续取A中的下两个位置,计算平均数,然后把结果放到新数组的0,1位置。
我知道的唯一方法是用双重循环来实现,但因为我会用到最大3000x3000的数组,所以我觉得应该有更好的方法!谢谢!
2 个回答
1
我觉得没有更好的解决办法,除非你对那些数组里的内容有一些额外的信息。如果它们只是一些随机数字,那你就得进行(n^2)/2次计算,而你的算法正是反映了这一点,运行时间是O((n^2)/2)。
10
numpy数组有一个非常实用的功能,就是可以以多种方式改变形状和查看数据,这样做可以让某些操作变得非常简单。
因为你想把每两个项目配对,所以把一个6x6的数组变成一个18x2的数组是很合理的:
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]]
或者,可以用一行代码来完成:
means=arr.reshape(-1,2).mean(axis=1).reshape(6,-1)
补充说明:改变形状的操作非常快,因为它返回的是一个视图,而不是原数组的副本。改变的只是数组的维度和步幅。最后只需要调用一次mean
方法。因此,这个解决方案在使用numpy时应该是尽可能快的。