如何遍历数组的3x3窗口并筛选非1值?
解决3x3滑动窗口中高亮/打印非1值的问题
首先,你的代码里有两个关键问题导致输出异常:
- 嵌套循环里手动重置了
i=0和j=range(0,4),直接打乱了窗口遍历的逻辑,导致一直在重复处理同一个窗口; 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
相关产品推荐
相关产品推荐

