【问题标题】:python3 - get average of n x n array within a 600 x 600 numpy arraypython3 - 在 600 x 600 numpy 数组中获取 n x n 数组的平均值
【发布时间】:2018-02-16 02:19:09
【问题描述】:

我正在编写一个需要 4 个参数的方法:

  1. im: 一个 600 x 600 的 numpy 数组,填充的值范围为 0 - 1000
  2. pos_1:im 中的 x 索引
  3. pos_2:im 中的 y 索引
  4. grid_size:给定用户输入创建的子网格的大小,用于平均

我想返回 [pos_1, pos_2] 位置周围的 n x n 网格中的平均值。 Grid_size 将为 5、7 或 9。

例如。如果 grid_size 是 5,pos_1 是 20,pos_2 是 150,我会在一个 5 x 5 的网格中求和,以 im[20,150] 为中心除以 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 网格中的位置的平均值。

我只能想象在很多“如果”情况下这样做。有没有更好的方法来做到这一点?

【问题讨论】:

标签: python arrays numpy


【解决方案1】:

使用 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]])

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 2013-11-28
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多