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

手动实现小数转整数且可还原原数据的方案(禁用np.round())

手动实现numpy数组的自定义小数转整数及还原功能

给定numpy数组:

import numpy as np

A = np.array([
    [1.7, 3.8, 21.7, 19.7, 3.6000001, 81.5],
    [2.8, 8.0, 78.3, 82.3, 36.5, 11.1]
])

需按以下规则手动转换小数为整数:

  • 小数部分为.0时,保持整数部分不变;
  • 小数部分为.1至.9时,整数部分加1(对应规则:.1+9、.2+8….9+1,本质是小数部分补至1,整数进位);
    转换后的预期数组(注:原预期中19.7→19.0应为笔误,按规则应转为20.0):
expected_A = np.array([
    [2.0, 4.0, 22.0, 20.0, 4.0, 82.0],
    [3.0, 8.0, 79.0, 83.0, 37.0, 12.0]
])

要求实现转换后还原为原数据的功能,且禁止使用np.round()。


实现思路

要满足自定义转换+可还原的需求,核心是保留原数组的小数部分信息:

  1. 转换阶段:拆分原数组的整数部分和小数部分,根据规则生成转换后的整数数组;
  2. 还原阶段:利用转换后的整数数组+保存的小数部分,逆向计算得到原数据。

代码实现

import numpy as np

def custom_convert(arr):
    """将数组按自定义规则转换为整数数组,同时返回小数部分用于还原"""
    # 提取整数部分(向下取整)
    integer_part = np.floor(arr)
    # 提取小数部分
    decimal_part = arr - integer_part
    # 按规则转换:小数部分非0则整数进位,否则保持
    converted_arr = np.where(decimal_part == 0, integer_part, integer_part + 1)
    return converted_arr, decimal_part

def custom_restore(converted_arr, decimal_part):
    """利用转换后的数组和小数部分还原原数据"""
    # 逆向计算:进位的元素用转换后的值减去(1-小数部分),未进位的直接返回
    restored_arr = np.where(decimal_part == 0, converted_arr, converted_arr - (1 - decimal_part))
    return restored_arr

测试验证

# 原数组
A = np.array([
    [1.7, 3.8, 21.7, 19.7, 3.6000001, 81.5],
    [2.8, 8.0, 78.3, 82.3, 36.5, 11.1]
])

# 转换
converted_A, decimals = custom_convert(A)
print("转换后的数组:")
print(converted_A)
# 输出:
# [[ 2.  4. 22. 20.  4. 82.]
#  [ 3.  8. 79. 83. 37. 12.]]

# 还原
restored_A = custom_restore(converted_A, decimals)
print("\n还原后的数组与原数组是否一致:")
print(np.allclose(restored_A, A))  # 输出True(处理浮点数精度问题)

说明

  • 转换逻辑完全遵循自定义规则,未使用np.round(),避免了round方法无法还原原数据的问题;
  • 通过保存小数部分,还原过程可以在浮点数精度范围内精准恢复原数据;
  • 针对原预期中的19.7→19.0,推测为笔误,按规则.7+3=10应进位为20.0,代码实现符合规则逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:20:02