python numpy数组切片

时间:2011-05-22 19:43:19

标签: python arrays indexing numpy slice

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

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

2 个答案:

答案 0 :(得分: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]]

或作为1-liner:

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

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

答案 1 :(得分:1)

我认为没有更好的解决方案,除非您有关于这些阵列中的内容的一些额外信息。如果它们只是随机数,则必须进行(n ^ 2)/ 2次计算,并且您的算法反映了这一点,以O((n ^ 2)/ 2)运行。