当前位置: 首页 > news >正文

LLM系列:1.Python入门:2.数值型对象运算与科学计算实战

1. Python数值型对象基础:从创建到实战

第一次接触Python做数据分析时,我被各种数值类型绕晕了——明明都是数字,为什么要有int、float、complex之分?后来处理LLM的embedding数据时才明白,这就像做菜要分食材,数值类型就是数据处理的"原材料"。让我们用实际场景拆解这三种基础类型。

1.1 整数型(int):计数与索引的基石

整数在LLM预处理中最常见的用途就是计数和索引。比如统计文本词频时,每个词出现的次数必须用整数记录。我常用两种创建方式:

# 直接赋值创建 word_count = 15 print(type(word_count)) # 输出: <class 'int'> # 通过int()转换 temperature = 38.5 discrete_temp = int(temperature) # 输出: 38 (直接截断小数)

这里有个新手容易踩的坑:int()是截断不是四舍五入。上周处理温度数据时就因为这个导致统计偏差,应该先用round()再转int:

correct_temp = int(round(38.7)) # 正确做法 → 39

1.2 浮点型(float):科学计算的标配

处理神经网络的权重参数时,浮点数才是主角。创建浮点数有三大实用技巧:

# 常规写法 learning_rate = 0.001 # 科学计数法(处理极大/极小值特别方便) avogadro = 6.022e23 # 阿伏伽德罗常数 electron_mass = 9.109e-31 # 电子质量 # 强制转换 batch_size = 32 float_batch = float(batch_size) # 32.0

特别注意:金融计算要慎用float!曾经有个同事用float存金额,0.1+0.2居然得到0.30000000000000004,后来改用Decimal模块才解决。

1.3 复数(complex):信号处理的秘密武器

虽然NLP中较少使用,但在语音信号处理时复数大显身手。创建复数时注意虚部用j:

# 创建频域信号 signal = 3 + 4j print(signal.real) # 实部 → 3.0 print(signal.imag) # 虚部 → 4.0 # 极坐标转换 import cmath polar = cmath.phase(signal) # 相位角 → 0.9272952180016122

2. 数值运算核心操作:从基础到进阶

刚开始写数据处理代码时,我总被各种运算符搞混,直到把它们分成三个等级来理解:

2.1 新手必会的算术运算符

这组运算符就像计算器上的基本功能:

a, b = 7, 3 print(a + b) # 加法 → 10 print(a - b) # 减法 → 4 print(a * b) # 乘法 → 21 print(a / b) # 真除法 → 2.333... print(a // b) # 整除法 → 2 print(a % b) # 取余 → 1 (周期计算常用) print(a ** b) # 幂运算 → 343

实际案例:用%实现循环队列索引时特别方便:

index = (current_index + offset) % queue_length

2.2 数据处理三剑客:abs/max/min

数据清洗时这三个函数使用频率超高:

# 特征归一化前先取绝对值 features = [-1.2, 2.5, -0.8] abs_features = [abs(x) for x in features] # [1.2, 2.5, 0.8] # 找极值 max_value = max(3, 7, 2) # 7 min_value = min([1.5, 2.0, 0.8]) # 0.8 (也支持迭代器)

2.3 舍入控制round的陷阱

round()函数有个反直觉的特性——银行家舍入法(四舍六入五成双):

print(round(3.5)) # 4 print(round(4.5)) # 4 (!) print(round(2.675, 2)) # 2.67 (!)

金融场景建议用decimal模块,科学计算可以这样处理:

def safe_round(x, digits=0): return int(x * 10**digits + 0.5) / 10**digits

3. math模块的科学计算实战

当内置函数不够用时,math模块就是我们的瑞士军刀。先看个典型导入方式:

import math from math import sqrt # 推荐单独导入常用函数

3.1 指数与对数运算

LLM的损失函数计算离不开这些:

# 自然指数 math.exp(2) # e^2 ≈ 7.389 # 各种对数 math.log(100, 10) # log10(100) = 2.0 math.log2(1024) # 10.0 math.log1p(1e-5) # 处理微小值更精确

3.2 取整与开方

数据分箱(binning)时的必备技能:

# 两种取整方式 math.ceil(3.2) # 向上 → 4 math.floor(3.8) # 向下 → 3 # 平方根比较 math.sqrt(9) # 3.0 9 ** 0.5 # 等价写法

3.3 三角函数与距离计算

处理词向量相似度时会用到:

angle = math.radians(60) # 角度转弧度 math.cos(angle) # 0.5000000000000001 # 欧氏距离 def euclidean_distance(v1, v2): return math.sqrt(sum((x-y)**2 for x,y in zip(v1,v2)))

4. 复合运算符与性能优化

处理大规模数据时,这些技巧能提升10倍性能:

4.1 复合运算符的妙用

不仅简化代码,还能减少临时对象创建:

# 传统写法 count = count + 1 # 优化写法 count += 1 # 同样适用于列表追加等操作

4.2 数值运算的性能陷阱

比较三种计算方式的效率差异:

# 最慢:循环累加 result = 0 for i in range(1000000): result += i**2 # 中等:列表推导 sum([i**2 for i in range(1000000)]) # 最快:生成器表达式 sum(i**2 for i in range(1000000))

4.3 类型转换的性能对比

批量处理时类型转换也有讲究:

import numpy as np # Python原生转换 %timeit [float(x) for x in range(1000)] # 约50μs # NumPy向量化 %timeit np.arange(1000, dtype=float) # 约1μs

5. 综合实战:从数据预处理到特征工程

结合Kaggle竞赛案例,看数值运算的完整流程:

5.1 数据标准化处理

使用基本运算实现Z-score标准化:

def z_score_normalize(data): mean = sum(data) / len(data) std_dev = math.sqrt(sum((x-mean)**2 for x in data) / len(data)) return [(x-mean)/std_dev for x in data]

5.2 特征缩放技巧

将数值特征压缩到[0,1]区间:

def min_max_scale(data): min_val = min(data) max_val = max(data) return [(x-min_val)/(max_val-min_val) for x in data]

5.3 分箱离散化处理

将连续年龄转换为年龄段:

age = [23, 45, 67, 12, 35] # 使用math.floor实现 bins = [math.floor(x/10)*10 for x in age] # [20, 40, 60, 10, 30]

6. 调试技巧与常见错误

这些年我踩过的坑总结:

6.1 浮点数精度问题

# 错误比较方式 if 0.1 + 0.2 == 0.3: # False! pass # 正确做法 from math import isclose isclose(0.1 + 0.2, 0.3) # True

6.2 类型混用错误

# 类型不匹配 try: result = "Score: " + 95 # TypeError! except TypeError: result = f"Score: {95}"

6.3 大整数运算优化

Python的int不限长度,但超大数运算很慢:

# 普通计算 %timeit 2**10000 # 约50μs # 使用位移优化 %timeit 1 << 10000 # 约0.3μs
http://www.jsqmd.com/news/557972/

相关文章:

  • 本草模型训练数据质量深度评估:8000医学问答对的分析与优化指南
  • OpenClaw+GLM-4.7-Flash:低成本搭建个人AI工作流
  • Realistic Vision V5.1在产品设计中的应用:目标用户画像写实化呈现
  • 企业级前端基建:如何将离线npm包(tgz)安全迁移到Nexus 3私库?
  • 用若依+帆软报表,30分钟搭一个带数据大屏的管理后台(SpringBoot+Vue实战)
  • 终极指南:如何用Compressor.js实现前端图片压缩最佳实践
  • 春联生成模型-中文-base保姆级教程:从镜像拉取、模型加载到批量导出PDF
  • Swift响应式编程终极指南:SwiftyUserDefaults与Combine框架深度集成
  • Windows权限管理进阶:UAC配置与安全策略实战
  • OpenClaw多任务队列:GLM-4.7-Flash并行处理邮件整理与文档生成
  • 极简部署方案:星图GPU平台OpenClaw+GLM-4.7-Flash体验
  • SSD推理实战:从原始图像到目标检测的可视化过程完整指南
  • 新手必看:Intel D435i深度相机在ROS1下到底发布了哪些话题?一篇看懂所有数据流
  • 终极指南:10个提升npm依赖管理效率的depcheck最佳实践技巧 [特殊字符]
  • Zynq7020 U-Boot 实战:从网口到 QSPI 的完整启动流程
  • 如何快速上手CSShake:5分钟学会CSS抖动动画库
  • AMC1100隔离放大器实战:如何用DUB封装搞定三相电流电压测量?
  • Cuvil如何将PyTorch模型推理延迟压至8.2ms?——基于v0.9.4核心IR生成与GPU Kernel融合源码深度拆解
  • QGIS实战:基于GDAL算法实现单波段数据到RGB彩色渲染
  • 避开150M限制!Alstudio模型文件传输的5个隐藏技巧(含挂载数据集避坑)
  • RWKV7-1.5B-g1a作品集:中英双语技术博客摘要生成(保留术语准确性)
  • TSDoc代码片段处理终极指南:DocFencedCode和DocCodeSpan实现对比
  • foobox-cn:让foobar2000焕发新生的界面增强工具
  • Zynq CAN驱动深度解析:从裸机到FreeRTOS的中断与回调实战
  • 4YA-3玉米联合收割机全套(共有800多张CAXA图纸)(三行中原)
  • Java学习笔记_Day17(集合)
  • 手机号智能定位系统:企业级地理信息服务的技术革新与商业价值
  • 如何在5分钟内免费激活Windows和Office:KMS_VL_ALL_AIO终极教程
  • 终极指南:如何为智能硬件构建高效语音交互系统
  • OpenClaw数据可视化:GLM-4.7-Flash分析结果自动图表生成