Python如何将带正负的浮点数数组保留符号归一化到指定范围
带符号浮点数数组归一到[-5,5]区间的实现方法
核心需求
将包含正负值的浮点数数组映射到[-5,5]区间,且严格保留原始数值的正负符号,正数映射后仍为正,负数映射后仍为负。
可选实现方案
方案1:全局最大绝对值对称缩放(推荐,保留原始数值比例)
实现逻辑
- 计算数组所有元素的最大绝对值
max_abs,以此为基准做等比例对称缩放,天然保留原始符号 - 单元素归一化公式:
normalized_x = (x / max_abs) * 5- 原始值<0:结果落在[-5, 0)区间
- 原始值>0:结果落在(0, 5]区间
- 原始值=0:归一化后仍为0
Python代码示例
import numpy as np # 示例输入数组 raw_arr = np.array([-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21]) # 计算最大绝对值,加极小常数避免全零数组的除零错误 max_abs = np.max(np.abs(raw_arr)) + 1e-8 # 执行归一化 normalized_arr = (raw_arr / max_abs) * 5 print(normalized_arr)
示例输出
[-5. -2.70212766 -4.38297872 -2.40425532 -1.95744681 -0.95744681 0.42553191 1.70212766 2.34042553 3.19148936 3.61702128 4.46808511]
方案2:正负分区间独立归一(正负区间均占满上下限)
实现逻辑
如果需要负数区间完全覆盖[-5,0]、正数区间完全覆盖[0,5],可以对正负值分别做归一:
- 负数部分:将[最小负值, 0]映射到[-5, 0],公式:
normalized_x = (x / min_negative) * (-5),min_negative为数组中最小的负数 - 正数部分:将[0, 最大正值]映射到[0,5],公式:
normalized_x = (x / max_positive) * 5,max_positive为数组中最大的正数
Python代码示例
import numpy as np raw_arr = np.array([-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21]) normalized_arr = np.zeros_like(raw_arr) # 处理负数 neg_mask = raw_arr < 0 if np.any(neg_mask): min_neg = np.min(raw_arr[neg_mask]) normalized_arr[neg_mask] = (raw_arr[neg_mask] / min_neg) * (-5) # 处理正数 pos_mask = raw_arr > 0 if np.any(pos_mask): max_pos = np.max(raw_arr[pos_mask]) normalized_arr[pos_mask] = (raw_arr[pos_mask] / max_pos) * 5 print(normalized_arr)
示例输出
[-5. -2.70212766 -4.38297872 -2.40425532 -1.95744681 -0.95744681 0.47619048 1.9047619 2.61904762 3.57142857 4.04761905 5. ]
内容的提问来源于stack exchange,提问作者Sina
相关产品推荐
相关产品推荐

