python - 通过取相邻元素的平均值来替换 numpy 矩阵中的元素
问题描述
我正在尝试用相关单元格附近的矩阵单元格的平均值(即值低于阈值的矩阵单元格的平均值)替换某个阈值以下的 numpy 矩阵中的值。
例如,让我们考虑这个 10*10 矩阵(比如matrx
):
matrx = np.array([[1,4,9,2,2,5,1,1,9,1],[2,4,3,5,2,2,1,2,1,1],
[3,4,-2,-3,4,2,3,5,1,2],[2,3,-3,-5,3,3,7,8,-4,1],[3,4,2,3,4,2,3,7,3,2],
[1,4,9,3,4,3,3,2,9,4],[2,1,3,5,2,2,3,2,3,3],
[3,6,8,3,7,2,3,5,3,2],[5,-2,-3,5,2,3,7,8,4,3],[4,-2,-3,1,1,2,3,7,3,5]])
print matrx
[[ 1 4 9 2 2 5 1 1 9 1]
[ 2 4 3 5 2 2 1 2 1 1]
[ 3 4 -2 -3 4 2 3 5 1 2]
[ 2 3 -3 -5 3 3 7 8 -4 1]
[ 3 4 2 3 4 2 3 7 3 2]
[ 1 4 9 3 4 3 3 2 9 4]
[ 2 1 3 5 2 2 3 2 3 3]
[ 3 6 8 3 7 2 3 5 3 2]
[ 5 -2 -3 5 2 3 7 8 4 3]
[ 4 -2 -3 1 1 2 3 7 3 5]]
而且,让我们假设阈值为零。目前,我正在使用以下方法找到值低于零的单元格的 (2d) 位置:
threshold = 0
mark_x = np.where( matrx<0 )[0]
mark_y = np.where( matrx<0 )[1]
在我的工作中,值低于阈值的单元格大多出现在块中(如矩阵中所见)。目前,我将所有值低于阈值的单元格替换为矩阵 ( matrx
) 的平均值。
但是,我想做得更好,并将低于阈值的元素的值替换为与相关单元相邻的良好相邻元素的平均值。这里,“好”相邻单元格将是那些值高于阈值的相邻单元格。对于低于阈值的单元格周围的相邻单元格大小的选择,我有点灵活(对于低于阈值的每个单元格,相邻单元格的大小将相同。)
下图给出了我想要实现的目标。在下面给出的图片中,每个斑点周围的红色边界值低于阈值,代表最近的邻居。在每个有界框内,带有红色勾号的单元格是我们在替换值低于阈值的单元格的值时要考虑其平均值的单元格。
当我们发现值低于阈值的单元格时,我们期望看到大小不等的 blob ;还有边界附近的斑点。
在 Python 中,实现这一预期目标的最佳方法是什么?我将非常感谢任何答案。
解决方案
这可能有效,但是,您可能更愿意保留原始矩阵并更改副本以使其更精确:
for x, y in zip(mark_x, mark_y) :
slice = matrx[max(0, x-2):x+2, max(0,y-2):y+2] # assuming you want 5x5 square
matrx[x,y] = np.mean([i for i in slice.flatten() if i > 0]) # threshold is 0
给出结果:
array([[1, 4, 9, 2, 2, 5, 1, 1, 9, 1],
[2, 4, 3, 5, 2, 2, 1, 2, 1, 1],
[3, 4, 3, 3, 4, 2, 3, 5, 1, 2],
[2, 3, 3, 3, 3, 3, 7, 8, 3, 1],
[3, 4, 2, 3, 4, 2, 3, 7, 3, 2],
[1, 4, 9, 3, 4, 3, 3, 2, 9, 4],
[2, 1, 3, 5, 2, 2, 3, 2, 3, 3],
[3, 6, 8, 3, 7, 2, 3, 5, 3, 2],
[5, 4, 3, 5, 2, 3, 7, 8, 4, 3],
[4, 4, 4, 1, 1, 2, 3, 7, 3, 5]])
推荐阅读
- azure-functions - 有没有办法查看 Azure Functions 运行时在 Linux 中的更新时间?
- regex - 为什么我的正则表达式会随着更多的运营商而呈指数级增长?
- javascript - 如何让屏幕阅读器完成表列名的播报,暂停再播报列的补充信息?
- java - 为什么这个局部变量在 Java 中等于 null?
- google-apps-script - 根据用户输入搜索正确的范围
- assembly - 程序集打印错误的 ascii 字符
- resharper-9.0 - 为什么 resharper 在文件中添加 // unsed 注释
- html - 我无法点击无序列表中的链接
- node-sass - 使用 NPM 安装包的问题
- javascript - 从本地 API 获取数据