寻找最大奇数尺寸子矩阵:现有代码输出不符,求解决方案及替代方法
寻找最大奇数尺寸子矩阵
需求
寻找最大奇数尺寸子矩阵,要求支持子矩阵内部包含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
相关产品推荐
相关产品推荐

