基于信号衰减规则的网络信号强度二维数组填充实现方案
解决多源信号衰减传播问题
这个问题本质是多源信号的衰减传播计算:每个非0节点是信号源,信号向四周传播,每经过1个节点(曼哈顿距离每增加1)强度衰减1,每个节点的最终信号值取所有可达源能提供的最大信号值(结果不能为负)。
用NumPy可以高效实现这个逻辑,步骤如下:
1. 提取信号源的位置与强度
首先从初始数组中找出所有非0的信号源,记录它们的坐标和对应的强度:
import numpy as np # 初始数组 d_initial = np.array([[0, 0, 0, 3], [0, 2, 0, 3], [0, 0, 0, 0], [0, 0, 0, 3]]) # 获取所有信号源的坐标(y, x)和对应的强度 sources = [] for y in range(d_initial.shape[0]): for x in range(d_initial.shape[1]): val = d_initial[y, x] if val > 0: sources.append((y, x, val))
2. 生成网格坐标矩阵
为了批量计算每个节点到所有源的曼哈顿距离,先生成整个网格的坐标矩阵:
# 生成y轴和x轴的坐标网格 y_grid, x_grid = np.meshgrid(np.arange(d_initial.shape[0]), np.arange(d_initial.shape[1]), indexing='ij')
3. 计算每个源的信号贡献并取最大值
对每个信号源,计算它给每个节点的信号值(源强度 - 曼哈顿距离,结果小于0则置0),然后所有源的贡献取最大值:
# 初始化结果数组为全0 d_result = np.zeros_like(d_initial) for y_src, x_src, strength in sources: # 计算当前源到每个节点的曼哈顿距离 distance = np.abs(y_grid - y_src) + np.abs(x_grid - x_src) # 计算该源的信号贡献:强度衰减后不能为负 contribution = np.maximum(strength - distance, 0) # 更新结果数组:取当前最大值 d_result = np.maximum(d_result, contribution)
4. 验证结果
运行上述代码后,d_result就会和目标数组完全一致:
print(d_result) # 输出: # [[0 1 2 3] # [1 2 2 3] # [0 1 1 2] # [0 1 2 3]]
逻辑说明
- 曼哈顿距离:信号向上下左右相邻节点传播,每移动一个节点距离加1,符合曼哈顿距离的计算规则
- 取最大值:若一个节点被多个信号源覆盖,取能提供的最强信号值
- 非负限制:如果源强度减去距离后为负,说明信号无法到达该节点,保持0
内容的提问来源于stack exchange,提问作者ChronoVortex
相关产品推荐
相关产品推荐

