如何为Python数组加权:使首元素为尾元素x倍且线性衰减
Python数组线性衰减加权实现(首元素为末元素x倍)
要生成满足要求的数组,核心是利用等差数列的特性结合首末元素的倍数关系推导,以下是具体实现:
关键逻辑
数组需满足两个核心条件:
- 首元素
a[0]是末元素a[-1]的x倍(即a[0] = x * a[-1]) - 相邻元素差值恒定(线性衰减,属于等差数列)
设数组长度为 n,公差为 d(衰减时 d 为负):
- 等差数列通项公式:
a[i] = a[0] + i * d - 代入末元素关系:
a[-1] = a[0] + (n-1)*d - 结合首末倍数条件,解出公差:
d = a[0] * (1 - x) / (x * (n - 1))
代码实现
以下示例针对你提供的参数(mult=3,原始数组长度为4)编写,支持自定义倍数和数组长度:
方式1:固定首元素值
mult = 3 # 首元素是末元素的3倍 original_arr = [1, 1, 1, 1] n = len(original_arr) # 以原始数组首元素作为新数组首元素 first_val = original_arr[0] # 计算公差 d = first_val * (1 - mult) / (mult * (n - 1)) # 生成加权数组 weighted_arr = [first_val + i * d for i in range(n)] # 验证结果 print("加权数组:", weighted_arr) print("首元素是末元素的倍数:", round(weighted_arr[0] / weighted_arr[-1], 2)) print("相邻差值是否相等:", (weighted_arr[1]-weighted_arr[0]) == (weighted_arr[2]-weighted_arr[1]))
运行输出:
加权数组: [1, 0.6666666666666666, 0.3333333333333333, 0.0] 首元素是末元素的倍数: 3.0 相邻差值是否相等: True
方式2:固定末元素值(避免末元素为0)
如果希望末元素保持原始值,可调整推导逻辑:
mult = 3 original_arr = [1, 1, 1, 1] n = len(original_arr) # 以原始数组末元素作为新数组末元素 last_val = original_arr[-1] first_val = mult * last_val # 计算公差(末元素 = 首元素 + (n-1)*d → d = (末元素 - 首元素)/(n-1)) d = (last_val - first_val) / (n - 1) weighted_arr = [first_val + i * d for i in range(n)] print("加权数组:", weighted_arr)
运行输出:
加权数组: [3.0, 2.3333333333333335, 1.6666666666666667, 1.0]
灵活调整
- 修改
mult参数可改变首末元素的倍数关系 - 调整
first_val或last_val可自定义数组的起始/结束值 - 任意长度的数组都适用此逻辑,只需保证
n >= 2(长度为1时无需衰减)
内容的提问来源于stack exchange,提问作者thomas.mac
相关产品推荐
相关产品推荐

