为何Min-Max归一化在Python中处理dtype='<i2'数据时结果异常?
问题原因
你用的<i2是16位有符号整数(int16),它的取值范围是[-32768, 32767]。当计算np.amax(array) - np.amin(array)时,如果数组的最大值和最小值跨度超过int16的存储上限(比如最大值接近32767、最小值接近-32768),两者的差值会达到65535,远大于int16能容纳的最大值32767,直接触发整数溢出,导致计算结果失真,同时抛出overflow encountered in scalar subtract警告。后续的归一化计算基于错误的差值,自然会得到[-130,130]这种完全不符合预期的范围。
解决办法
修改归一化函数,在计算前先把数组转换成浮点类型(比如float32或float64),从根源避免整数溢出问题:
import numpy as np def MinMaxNormalize(array): # 转换为浮点类型再进行计算 arr_float = array.astype(np.float32) min_val = np.amin(arr_float) max_val = np.amax(arr_float) # 处理所有值相同的极端情况,避免除以0报错 if max_val == min_val: return np.zeros_like(arr_float) return (arr_float - min_val) / (max_val - min_val)
额外优化提示
加载raw数据后,也可以直接转换成浮点类型再处理,减少中间步骤的类型隐患:
imarray = raw_data.reshape((height, width)).astype(np.float32)
内容的提问来源于stack exchange,提问作者DiegoA86
相关产品推荐
相关产品推荐

