如何创建中心值最高、用于热图绘制的n×n二维数组?
实现中心数值最高的n×n热图数组
要生成符合要求的数组,核心逻辑是基于每个元素到数组中心的距离,映射出递减的数值。以下是具体实现思路和Python代码:
核心步骤
- 确定数组中心坐标:
- 若n为奇数,中心是整数坐标
(center, center),其中center = n // 2 - 若n为偶数,取四个中心位置的中点作为虚拟中心,坐标为
(center - 0.5, center - 0.5),保证对称
- 若n为奇数,中心是整数坐标
- 计算每个元素到中心的距离:推荐用欧氏距离,得到的数值衰减更平滑;也可以用曼哈顿距离(计算更快)
- 距离转递减数值:常用两种方式:
- 高斯函数:
exp(-distance²/(2σ²)),σ控制衰减速度,数值范围0~1,中心为1 - 倒数映射:
1/(distance + 1),计算简单,数值随距离增大逐渐趋近于0
- 高斯函数:
Python 实现代码
方法1:高斯函数(平滑衰减)
import numpy as np def create_heatmap_array(n, sigma=1.0): # 生成坐标网格 x = np.arange(n) y = np.arange(n) xx, yy = np.meshgrid(x, y) # 计算中心坐标 center = n // 2 if n % 2 == 1 else (n / 2 - 0.5) # 计算欧氏距离 distance = np.sqrt((xx - center)**2 + (yy - center)**2) # 高斯函数转换为递减数值 heatmap = np.exp(-(distance**2) / (2 * sigma**2)) return heatmap
方法2:简单倒数映射
import numpy as np def create_heatmap_array(n): x = np.arange(n) y = np.arange(n) xx, yy = np.meshgrid(x, y) center = n // 2 if n % 2 == 1 else (n / 2 - 0.5) distance = np.sqrt((xx - center)**2 + (yy - center)**2) # 倒数映射,避免除以0(中心距离为0,加1保证中心值为1) heatmap = 1 / (distance + 1) return heatmap
示例使用
比如生成5×5的数组:
arr = create_heatmap_array(5) print(arr)
输出(高斯方法,sigma=1):
[[0.1353 0.3679 0.6065 0.3679 0.1353] [0.3679 0.6065 0.8825 0.6065 0.3679] [0.6065 0.8825 1. 0.8825 0.6065] [0.3679 0.6065 0.8825 0.6065 0.3679] [0.1353 0.3679 0.6065 0.3679 0.1353]]
自定义调整
- 若需要更快的计算,可以把欧氏距离换成曼哈顿距离:
distance = np.abs(xx - center) + np.abs(yy - center) - 调整sigma可以改变衰减速度:sigma越大,数值衰减越慢,热图的“热点”范围越广
- 如果需要整数数值,可以对结果进行缩放后取整,比如
heatmap = (np.exp(-(distance**2)/(2*sigma**2)) * 100).astype(int)
内容的提问来源于stack exchange,提问作者RGB Engineer
相关产品推荐
相关产品推荐

