如何将含正负值的Numpy视频特征数组归一化为仅含正值
解决Numpy视频特征数组归一化至全正值的问题
嘿,我来帮你搞定这个问题!你手里有个存在.npy文件里的视频特征数组,形状是(15,2048),既有正值也有负值,想把所有值转成正值,但之前写的代码没起作用是吧?
先说说你之前代码的问题:
Result = np.where(a >= 0, a/np.max(a), -a/np.min(a))
这里的核心bug出在处理负数的分支上——np.min(a)是数组里的最小值,肯定是个负数对吧?那-a(当a是负数时,-a就是正数)除以一个负数,结果又变成负数了!这就导致你处理完之后数组里还是有负值,完全达不到预期效果。
给你几个简单有效的解决方案,按需选择:
方法1:平移至全非负值(最小值为0)
这是最直接的方式,只需要把所有值减去数组的最小值,这样原来的最小值会变成0,其他所有值自然都是非负的,而且还能完整保留数据的相对差异:
import numpy as np # 加载你的特征数组 a = np.load("your_video_features.npy") # 平移数组,使最小值为0 normalized = a - np.min(a) # 验证结果:检查是否所有值都≥0 print(np.all(normalized >= 0)) # 应该输出True
方法2:归一化至0-1区间(全正值)
如果除了全正之外,还希望把值缩放到0到1之间,可以在平移后再除以数组的峰峰值(最大值减最小值):
# 先平移到最小值为0,再缩放到0-1区间 normalized_01 = (a - np.min(a)) / np.ptp(a) # 验证:所有值在0到1之间 print(np.min(normalized_01), np.max(normalized_01)) # 应该输出0.0和1.0
方法3:绝对值归一化(可选)
如果你不介意改变数据的符号意义,只是单纯要全正值,也可以直接取绝对值再归一化,但这种方式会抹掉原始数据的正负差异,只保留幅度信息,适合不需要符号特征的场景:
# 取绝对值后缩放到0-1区间 abs_normalized = np.abs(a) / np.max(np.abs(a))
这些方法都能轻松解决你的问题,其中方法1和2是更常用的,因为它们保留了原始数据的相对分布,更适合后续的特征处理任务。
内容的提问来源于stack exchange,提问作者A_B_Y
相关产品推荐
相关产品推荐

