如何将数字数组从原有范围映射到最小值为100、最大值为0的新范围
数组反向线性插值转换方案
核心原理
你需要的是保持相对距离不变的反向线性缩放,即原值越小映射后的值越大,原值越大映射后的值越小,推导逻辑如下:
- 首先确定两个区间的边界对应关系:
- 原数组最小值
min_val = 2→ 映射目标值100 - 原数组最大值
max_val = 9→ 映射目标值0
- 原数组最小值
- 计算原区间总跨度:
max_val - min_val = 7 - 每单位原值对应的新值变化量:
100 / 7 ≈ 14.29,即原值每升高1,映射后值下降14.29 - 最终通用映射公式:
映射后值 = 100 - (原值 - 2) * (100 / 7)
按这个公式计算你举的原值3的结果为 100 - 1*100/7 ≈ 85.71,你提到的95是近似体感,严格按相对距离不变的规则就是以上计算结果。
代码实现
Python 实现
基于Numpy(批量处理效率更高)
import numpy as np # 输入数组 original_arr = np.array([2, 5, 7, 9, 3]) min_val = original_arr.min() max_val = original_arr.max() # 执行转换 transformed_arr = 100 - (original_arr - min_val) * (100 / (max_val - min_val)) # 输出保留两位小数的结果:[100. 57.14 28.57 0. 85.71] print(transformed_arr.round(2))
纯Python原生实现
original_arr = [2, 5, 7, 9, 3] min_val = min(original_arr) max_val = max(original_arr) scale = 100 / (max_val - min_val) transformed_arr = [100 - (x - min_val) * scale for x in original_arr] # 输出结果:[100.0, 57.14285714285714, 28.57142857142857, 0.0, 85.7142857428572] print(transformed_arr)
JavaScript 实现
const originalArr = [2, 5, 7, 9, 3] const minVal = Math.min(...originalArr) const maxVal = Math.max(...originalArr) const scale = 100 / (maxVal - minVal) const transformedArr = originalArr.map(x => 100 - (x - minVal) * scale) console.log(transformedArr)
补充说明
如果后续有新的元素加入数组,只要取值在2到9之间,都可以直接套用上述公式计算;如果新元素超出这个范围,需要重新计算min和max值再调整公式参数。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

