Skip to main content
 首页 » 编程设计

python numpy数组切片

2025年05月04日12birdshome

我有一个二维数组,A 是 6x6。我想取前 2 个值(索引 0,0 和 0,1)并取两者的平均值并将平均值插入一个新数组,该数组是索引 0,0 处 A (6x3) 列大小的一半.然后我会在 A 处获取接下来的两个索引,取平均值并在 0,1 处放入新数组。

我知道如何做到这一点的唯一方法是使用双 for 循环,但出于性能目的(我将使用大至 3000x3000 的数组)我知道有更好的解决方案!谢谢!

请您参考如下方法:

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] 

最后,我们将数组 reshape 为 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-liner:

means=arr.reshape(-1,2).mean(axis=1).reshape(6,-1) 

PS: reshape 是一个非常快速的操作,因为它返回的是一个 View ,而不是原始数组的副本。所有改变的只是尺寸和步幅。剩下的就是对 mean 方法的一次调用。因此,这个解决方案应该尽可能快地使用 numpy。