python3 - 在600 x 600 numpy数组中获得n x n数组的平均值

时间:2018-02-15 04:37:24

标签: python arrays numpy

我正在编写一个带有4个参数的方法:

  1. im:一个600 x 600的numpy数组,其值为0 - 1000
  2. pos_1:im
  3. 中的x索引
  4. pos_2:y in index
  5. grid_size:给定用户输入创建的子网格的大小,用于平均
  6. 我想返回[pos_1,pos_2]位置周围n x n网格的平均值。 Grid_size将是5,7或9.

    EG。如果grid_size为5,pos_1为20且pos_2为150,我将在以[20,150]为中心的5 x 5网格中的值除以25(5 x 5)。目前的实施是:

    def calc_density(im, pos_1, pos_2, grid_size):
        grid_sum = 0
        if(pos_1 < 600 - (grid_size - 1)/2):
            if(pos_1 > (grid_size - 1)/2):
                if(pos_2 < 600 - (grid_size - 1)/2):
                    if(pos_1 > (grid_size - 1)/2):
                        for i in range(grid_size):
                            for j in range(grid_size):
                                grid_sum = grid_sum + im[(pos_1 - (grid_size - 1)/2) + i, (pos_2 - (grid_size - 1)/2) + j]
    

    此方法适用于[pos_1,pos_2]不在im的边缘内(grid_size - 1)/ 2的任何情况。如果确实如此,那么平均n x n网格将落在im之外。如果发生这种情况,那么我希望放弃那些从im下降的位置,找到那些落在n x n网格中的平均值。

    我只能想象这样做很多&#39;如果&#39;案例。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

使用numpy工具以获得更具可读性和更高效的方式:

def density(arr,x0,y0,size):
    xb=x0-size//2
    yb=y0-size//2
    return arr[xb:,yb:][:size,:size].mean()

这可以根据您的需要正确管理边框:

In [46]: density(arr,603,603,9)
Out[46]: 743.0

In [47]: arr
Out[47]: 
array([[ 73, 197, 311, ..., 952, 477, 138],
       [751,  93, 291, ..., 983, 167, 599],
       [ 54, 666, 380, ..., 456, 466, 754],
       ..., 
       [186, 737, 829, ..., 929,  28, 923],
       [136, 408, 193, ..., 844, 649, 927],
       [477, 411, 458, ...,  64, 173, 743]])