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

寻找最大奇数尺寸子矩阵:现有代码输出不符,求解决方案及替代方法

寻找最大奇数尺寸子矩阵

需求

寻找最大奇数尺寸子矩阵,要求支持子矩阵内部包含nan值的场景。

输入数组

import numpy as np

array = np.array([[np.nan, 255, 255, 0, 0, 0, 0, 0, 255, np.nan],
                  [np.nan, 255, 255, 255, 0, 0, 0, 0, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 0, 0, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 255, 255, 255, 255, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, 255, 255, 255, 255, 255, 255, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 0, 255, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 0, 0, 0, 255, 255, np.nan],
                  [np.nan, 255, 255, 0, 0, 0, 0, 0, 255, np.nan],
                  [np.nan, 255, 255, 255, 0, 0, 0, 0, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 0, 255, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 255, 255, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 255, 255, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 255, 255, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 0, 255, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 255, 255, 255, 255, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                  [np.nan, 255, 255, 255, 255, 255, 255, 255, 255, np.nan],
                  [np.nan, 255, 255, 255, 255, 255, 255, 255, 255, np.nan]])

预期输出

[[255, 255, 255, 255, 255, 255, 255, 255],
    [255, 255, 255, 255, 0, 255, 255, 255, ],
    [255, 255, 255, 0, 0, 0, 255, 255],
    [255, 255, 0, 0, 0, 0, 0, 255],
    [255, 255, 255, 0, 0, 0, 0, 255],
    [255, 255, 255, 255, 0, 255, 255, 255],
    [255, 255, 255, 255, 255, 255, 255, 255],
    [255, 255, 255, 255, 255, 255, 255, 255],
    [255, 255, 255, 255, 255, 255, 255, 255],
    [255, 255, 255, 255, 0, 255, 255, 255],
    [255, 255, 255, 255, 255, 255, 255, 255]]

当前实现及问题

实现代码

m, n = array.shape

# Initialize the maximum submatrix size and its starting indices
max_submatrix_size = 0
max_submatrix_start_i = 0
max_submatrix_start_j = 0

# Iterate over all possible starting indices of the window
for i in range(m):
    for j in range(n):
        # Initialize the window size
        window_size = 0
        # Expand the window until it reaches the end of the array or encounters a non-255 value
        while i + window_size < m and j + window_size < n and array[i + window_size, j + window_size] == 255:
            window_size += 1
        # Update the maximum submatrix size and its starting indices
        if window_size > max_submatrix_size:
            max_submatrix_size = window_size
            max_submatrix_start_i = i
            max_submatrix_start_j = j
        # Shrink the window size and check again
        for k in range(1, window_size + 1):
            if i + k >= m or j + k >= n or array[i + k, j + k] != 255:
                break
            # Update the maximum submatrix size and its starting indices
            if k + 1 > max_submatrix_size:
                max_submatrix_size = k + 1
                max_submatrix_start_i = i
                max_submatrix_start_j = j
                window_size = k
            break

# Extract the largest submatrix
largest_submatrix = array[max_submatrix_start_i:max_submatrix_start_i + max_submatrix_size,
                          max_submatrix_start_j:max_submatrix_start_j + max_submatrix_size]

print(largest_submatrix)

实际输出

[[255. 255. 255.   0.   0.   0. 255. 255.]
 [255. 255.   0.   0.   0.   0.   0. 255.]
 [255. 255. 255.   0.   0.   0.   0. 255.]
 [255. 255. 255. 255.   0. 255. 255. 255.]
 [255. 255. 255. 255. 255. 255. 255. 255.]
 [255. 255. 255. 255. 255. 255. 255. 255.]
 [255. 255. 255. 255. 255. 255. 255. 255.]
 [255. 255. 255. 255.   0. 255. 255. 255.]]

问题说明

已尝试滑动窗口方法但未得到预期结果,现寻求正确解决方案,同时希望了解不同的实现思路。


内容的提问来源于stack exchange,提问作者Instagram diabollic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:52:03