手动实现小数转整数且可还原原数据的方案(禁用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()。
实现思路
要满足自定义转换+可还原的需求,核心是保留原数组的小数部分信息:
- 转换阶段:拆分原数组的整数部分和小数部分,根据规则生成转换后的整数数组;
- 还原阶段:利用转换后的整数数组+保存的小数部分,逆向计算得到原数据。
代码实现
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
相关产品推荐
相关产品推荐

