python - numpy 数组用掩码求平均值

标签 python arrays numpy

我希望在 bool numpy 数组上进行一些基本的聚类,我基本上只是尝试使用掩码进行 2d 平均,但我觉得一定有比我现有的更好的解决方案,因为它又慢又不优雅:

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

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

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

编辑:位置是类似于窗口形式的元组

例如,如果我们要做最简单的版本,使用统一的单层掩模,我会寻找类似的东西:

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

最佳答案

事实证明 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]])

关于python - numpy 数组用掩码求平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049119/

相关文章:

python - 在中间添加 child

c++ - 在 SWIG 中将可变 char * 传递给 Python

linux - 在 shell 脚本中操作数组(由 php-cli 打印)

python - cocos creator 无法为 android 平台构建

Python:从时间戳到日期时间

php - 使 PHP 对象表现得像一个数组?

c - 如何定义任意大小的二维数组,然后在编译时确定其维度?

python - 如何高效地执行循环语句进行数据分析?

python - 使用 numpy 在第一个矩阵列中搜索数组并获取下一列值

python - 对 Memmapped 数组进行操作的正确方法