You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历数组的3x3窗口并筛选非1值?

解决3x3滑动窗口中高亮/打印非1值的问题

首先,你的代码里有两个关键问题导致输出异常:

  1. 嵌套循环里手动重置了i=0和j=range(0,4),直接打乱了窗口遍历的逻辑,导致一直在重复处理同一个窗口;
  2. np.apply_along_axis(np.any, 0, x == 4)这行代码只是执行了但没有被利用,完全没起到筛选的作用。

下面是修正后的完整代码,能实现你要的“在每个3x3窗口中识别并高亮/打印不等于1的值”的需求:

from itertools import islice
import numpy as np
# import gdal  # 测试阶段可以先注释掉这行

np.set_printoptions(threshold=np.inf)
# img = gdal.Open(path)  # 实际使用时替换成你的文件路径
arr = np.array([[1,2,3,4], [2,3,4,5], [3,4,5,6], [4,5,6,7]])

def rolling_window(a, shape):
    s = (a.shape[0] - shape[0] + 1,) + (a.shape[1] - shape[1] + 1,) + shape
    strides = a.strides + a.strides
    return np.lib.stride_tricks.as_strided(a, shape=s, strides=strides)

def window2(arr, shape=(3,3)):
    r_extra = np.floor(shape[0] / 2).astype(int)
    c_extra = np.floor(shape[1] / 2).astype(int)
    out = np.empty((arr.shape[0] + 2 * r_extra, arr.shape[1] + 2 * c_extra))
    out[:] = np.nan
    out[r_extra:-r_extra, c_extra:-c_extra] = arr
    view = rolling_window(out, shape)
    
    # 遍历每一个3x3窗口
    for i in range(view.shape[0]):
        for j in range(view.shape[1]):
            current_window = view[i, j]
            print(f"窗口位置 ({i}, {j}):")
            
            # 方案1:直接提取所有不等于1的值(包含NaN)
            non_one_vals = current_window[current_window != 1]
            # 如果要排除NaN,改成:non_one_vals = current_window[(current_window != 1) & ~np.isnan(current_window)]
            print("不等于1的值列表:", non_one_vals)
            
            # 方案2:打印窗口并高亮非1值(用*标记)
            print("带高亮的窗口内容:")
            for row in current_window:
                highlighted = []
                for val in row:
                    if not np.isnan(val) and val != 1:
                        highlighted.append(f"*{val}*")
                    else:
                        highlighted.append(str(val))
                print(" ".join(highlighted))
            print("-"*30)

window2(arr, (3,3))

代码细节说明:

  • 移除了循环里错误的i和j重置操作,让程序能正常遍历每一个窗口;
  • 用布尔索引current_window != 1快速筛选非1值,逻辑简单高效;
  • 增加了高亮显示的逻辑,把非1数值用*包裹,打印时一眼就能看到;
  • 标注了每个窗口的位置(i,j),方便你对应到原数组的区域。

测试时的部分输出示例:

窗口位置 (0, 0):
不等于1的值列表: [nan nan nan nan 2. 3. nan 2. 3.]
带高亮的窗口内容:
nan nan nan
nan *2* *3*
nan *2* *3*
------------------------------
窗口位置 (0, 1):
不等于1的值列表: [nan nan nan 2. 3. 4. 2. 3. 4.]
带高亮的窗口内容:
nan nan nan
*2* *3* *4*
*2* *3* *4*
------------------------------

这样你就能清晰地看到每个窗口里的非1值,不管是直接提取列表还是高亮打印都能实现。

内容的提问来源于stack exchange,提问作者vigna purohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:41:13