You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Numpy处理正负元素归一化后输出全零数组的原因及修复方法

Numpy代码全零输出问题分析与修复

原代码

data = np.array([-3, -2, -1, 0, 1, 2, 3])
data[data < 0] = data[data < 0] / np.abs(np.sum(data[data < 0]))
data[data > 0] = data[data > 0] / np.abs(np.sum(data[data > 0]))

data
Out[109]: array([0, 0, 0, 0, 0, 0, 0])

问题原因

原数组data是整数类型(Numpy默认从整数列表生成int类型数组),执行除法操作时,Numpy会强制保持数组的整数类型,对浮点结果进行截断取整:

  • 负数部分总和为-6,绝对值是6,负数元素除以6得到的-0.5、-0.333...、-0.166...会被截断为整数0;
  • 正数部分总和为6,正数元素除以6得到的0.166...、0.333...、0.5同样被截断为整数0;
  • 中间的0保持不变,最终数组全为0。

修复方案

方案1:初始化时指定浮点类型

直接创建浮点型数组,确保除法结果保留小数:

data = np.array([-3, -2, -1, 0, 1, 2, 3], dtype=np.float64)
data[data < 0] = data[data < 0] / np.abs(np.sum(data[data < 0]))
data[data > 0] = data[data > 0] / np.abs(np.sum(data[data > 0]))

方案2:转换数组为浮点类型后再操作

在运算前将整数数组转为浮点型:

data = np.array([-3, -2, -1, 0, 1, 2, 3])
data = data.astype(np.float64)
data[data < 0] = data[data < 0] / np.abs(np.sum(data[data < 0]))
data[data > 0] = data[data > 0] / np.abs(np.sum(data[data > 0]))

方案3:让除法产生浮点结果

通过将除数转为浮点类型,触发浮点除法:

data = np.array([-3, -2, -1, 0, 1, 2, 3])
neg_total = np.abs(np.sum(data[data < 0]))
data[data < 0] = data[data < 0] / (neg_total * 1.0)
pos_total = np.abs(np.sum(data[data > 0]))
data[data > 0] = data[data > 0] / (pos_total * 1.0)

修复后运行结果:

array([-0.5       , -0.33333333, -0.16666667,  0.        ,  0.16666667,
        0.33333333,  0.5       ])

内容的提问来源于stack exchange,提问作者ZHENDONG ZHANG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:32:45