如何用Python实现基于最近邻算法的指定缩放因子2D数组放大?
基于最近邻算法的2D数组缩放实现(非块填充)
你需要的是基于真实距离计算的最近邻缩放,而非简单的块填充。以下是实现思路和代码:
需求说明
给定原始2D数组:
[[1, 2], [3, 4]]
缩放因子为3时,最终要得到的结果是:
[[1, 1, 2, 2, 2, 2], [1, 1, 2, 2, 2, 2], [3, 3, 4, 4, 4, 4], [3, 3, 4, 4, 4, 4], [3, 3, 4, 4, 4, 4], [3, 3, 4, 4, 4, 4]]
核心区别是:每个位置的值由距离它最近的原始数组元素决定,而非归属某个固定块。
实现代码
def nearest_neighbor_scale(original, scale): rows = len(original) cols = len(original[0]) if rows > 0 else 0 new_rows = rows * scale new_cols = cols * scale scaled = [[0]*new_cols for _ in range(new_rows)] # 先放置原始数组的元素到对应缩放位置 for oi in range(rows): for oj in range(cols): scaled[oi*scale][oj*scale] = original[oi][oj] # 遍历每个缩放后位置,计算最近邻值 for i in range(new_rows): for j in range(new_cols): min_dist_sq = float('inf') closest_val = 0 # 遍历所有原始元素的缩放位置,找最近的 for oi in range(rows): for oj in range(cols): ox, oy = oi*scale, oj*scale # 计算距离平方(避免开根号,提升效率) dist_sq = (i - ox)**2 + (j - oy)**2 if dist_sq < min_dist_sq: min_dist_sq = dist_sq closest_val = original[oi][oj] # 距离为0说明是原始点,直接跳过后续计算 if dist_sq == 0: break scaled[i][j] = closest_val return scaled # 测试示例 original_array = [[1, 2], [3, 4]] scale_factor = 3 result = nearest_neighbor_scale(original_array, scale_factor) # 打印结果 for row in result: print(row)
代码说明
- 初始化缩放数组:先将原始数组的每个元素放到缩放后的对应位置(
oi*scale, oj*scale),和你给出的初始放大数组一致。 - 计算最近邻:对缩放后的每个位置
(i,j),遍历所有原始元素的缩放位置,计算两者的距离平方(用平方代替欧氏距离,避免开根号的性能损耗),取距离最小的原始元素值填充当前位置。 - 关键逻辑:比如位置
(0,2),到原始点(0,0)的距离平方是4,到(0,3)的距离平方是1,因此会选择值2填充,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

