numpy数组与掩码平均

时间:2014-04-13 22:16:35

标签: python arrays numpy

我希望在布尔numpy数组上做一些基本的聚类,而我基本上只是尝试用掩码进行2d平均,但我觉得必须有比我更好的解决方案&# 39,因为它缓慢且不优雅而得到了:

def grab_window(location, array, window=(3,3)):
    minimums = [min(0, i-a) for i, a in zip(location, window)]
    maximums = [(i + a) for i, a in zip(location, window)]
    answer = array
    for i, _ in enumerate(location):
        answer = answer[slice(minimums[i],maximums[i])]
    return answer

然后我基本上只是遍历原始数组,将每个窗口乘以内核,然后返回修改后的窗口的平均值。

似乎必须有一个过滤器或类似的具有相同效果的东西,但到目前为止我还没能找到它。

编辑:位置是与窗口类似的表单的tuple

例如,如果我们要做最简单的版本,使用统一的1层面具,我会在这些方面寻找一些东西:

import numpy as np
test = np.arange(0,24).reshape(6, 4)
footprint = [
[1,1,1],
[1,0,1],
[1,1,1]
]
some_function(test, footprint)
array([[ 1,  2,  3,  4],
   [ 4,  5,  6,  6],
   [ 8,  9, 10, 10],
   [12, 13, 14, 14],
   [16, 17, 18, 18],
   [18, 19, 20, 21]])

1 个答案:

答案 0 :(得分:1)

结果scipy完全有一个已经做到这一点的功能。 generic_filter实际上以How to apply ndimage.generic_filter()

中提到的更为稳定的方式实现了这一点

示例:

def some_avg(values):
    return values.mean()

footprint = np.array([
    [1,1,1],
    [1,0,1],
    [1,1,1]
])

test = test = np.arange(0,24).reshape(6, 4)

scipy.ndimage.filters.generic_filter(test, some_avg, footprint=footprint)

array([[ 1,  2,  3,  4],
   [ 4,  5,  6,  6],
   [ 8,  9, 10, 10],
   [12, 13, 14, 14],
   [16, 17, 18, 18],
   [18, 19, 20, 21]])