如何编写生成特定嵌套结构N×N矩阵扁平化列表的函数?
问题描述
需要编写函数,输入奇数N,返回对应N×N矩阵的扁平化列表。矩阵规律为中心值为1,每向外一层数值递增2,示例如下:
3×3矩阵及其扁平化结果:
a_3x3 = [ # 3x3像素窗口 [3,3,3], [3,1,3], [3,3,3] ] a_3x3_lis = [3, 3, 3, 3, 1, 3, 3, 3, 3] # 扁平化后的列表
5×5矩阵及其扁平化结果:
a_5x5 = [ # 5x5像素窗口 [5,5,5,5,5], [5,3,3,3,5], [5,3,1,3,5], [5,3,3,3,5], [5,5,5,5,5] ] a_5x5_lis = [5, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 3, 1, 3, 5, 5, 3, 3, 3, 5, 5, 5, 5, 5, 5] # 扁平化后的列表
手动创建仅适用于小矩阵,需自动化实现方法。
自动化实现方案
规律分析
矩阵中每个位置的数值由其到中心的切比雪夫距离决定:
- 设矩阵中心坐标为
(center, center),其中center = N // 2(N为奇数) - 任意位置
(i,j)到中心的切比雪夫距离为max(abs(i - center), abs(j - center)) - 该位置的数值为
2 * 距离 + 1
实现代码
方法一:直接生成扁平化列表(高效简洁)
def generate_flattened_window(n): if n % 2 == 0: raise ValueError("N必须是奇数") center = n // 2 return [2 * max(abs(i - center), abs(j - center)) + 1 for i in range(n) for j in range(n)]
方法二:先生成矩阵再扁平化(便于调试)
如果需要先查看完整矩阵再扁平化,可使用此方法:
def generate_flattened_window(n): if n % 2 == 0: raise ValueError("N必须是奇数") center = n // 2 # 生成矩阵 matrix = [] for i in range(n): row = [] for j in range(n): distance = max(abs(i - center), abs(j - center)) row.append(2 * distance + 1) matrix.append(row) # 扁平化矩阵 return [num for row in matrix for num in row]
测试验证
# 测试3x3 print(generate_flattened_window(3)) # 输出:[3, 3, 3, 3, 1, 3, 3, 3, 3] # 测试5x5 print(generate_flattened_window(5)) # 输出:[5, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 3, 1, 3, 5, 5, 3, 3, 3, 5, 5, 5, 5, 5, 5] # 测试7x7 print(generate_flattened_window(7)) # 输出与示例的near_win_7x7完全一致
内容的提问来源于stack exchange,提问作者Nadavgk
相关产品推荐
相关产品推荐

