python numpy 数组切片

1 投票
2 回答
2088 浏览
提问于 2025-04-16 18:08

我有一个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时应该是尽可能快的。

撰写回答