获取数组某个部分的平均值

时间:2013-11-28 23:12:02

标签: python arrays numpy

我有一个数组:

import numpy as np

array = np.array([[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                  [ 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                  [ 1, 0, 2, 22, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1],
                  [ 1, 0, 1, 34, 99, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1],
                  [ 1, 0, 5, 11, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1],
                  [ 1, 0, 6, -5, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1],
                  [ 1, 0, 88, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1],
                  [ 1, 1, 333, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                  [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                  [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

我想得到我所在地区某个部分的平均值。区域中心位于索引[3][4],每个方向前进5步。

我认为一种方法是为感兴趣的区域创建一个子数组,并在该子数组上使用numpy.mean。我怎么能创建那个子数组?

我也对其他方法或想法感兴趣。

3 个答案:

答案 0 :(得分:2)

这是一个长篇版本,引导您完成以下步骤:

def center_mean(array, row, col, size):

    # Use min & max to handle edges
    row_min = max(0, row - size)
    row_max = min(len(array), row + size)

    col_min = max(0, col-size)
    col_max = min(len(array[0]), col + size)

    # Get just the rows we want:
    sub_rows = array[row_min:row_max + 1]

    total = 0.0
    for row in sub_rows:
        # Now take just the cols we want:
        new_row = row[col_min:col_max + 1]
        total += sum(new_row)

    return total / (size*2 + 1)**2


print(center_mean(array, 3, 4, 5))

答案 1 :(得分:1)

这样做的简单方法是制作数组的矩形切片:

>>> span = 5
>>> a[0:3+span+1, 0:4+span+1]
array([[  1,   1,   1,   1,   1,   1,   1,   1,   1],
       [  1,   1,   4,   3,   1,   1,   1,   1,   1],
       [  1,   0,   2,  22,   0,   1,   0,   0,   0],
       [  1,   0,   1,  34,  99,   1,   1,   0,   1],
       [  1,   0,   5,  11,   0,   1,   1,   0,   1],
       [  1,   0,   6,  -5,   0,   1,   1,   0,   1],
       [  1,   0,  88,   0,   0,   1,   0,   0,   0],
       [  1,   1, 333,   1,   1,   1,   1,   1,   1]])

当然,其意思是:

>>> np.mean(a[0:3+5, 0:4+5])
8.9305555555555554

要获得圆形切片,您可以使用:

i, j = np.indices(a.shape)
a[((i-3)**2 < 25) & ((j-4)**2 < 25)]

答案 2 :(得分:1)

i,j=3,4
m = array[max(0,i-5):i+5,max(0,j-5):j+5].mean()

注意:对于你的中心(3,4),子区域实际上是形状(8,9)而不是(11,11),因为它在边界处被切断。