第 9 篇 · 数值计算与图像处理:NumPy、SciPy、Pillow
数值计算与图像处理NumPy、SciPy、Pillow数据分析链路中除表格处理外还涉及两类底层能力数值计算数组运算、线性代数、插值与优化、信号处理与图像处理。本节以 NumPy、SciPy、Pillow 三个库为例说明这些能力的调用方式及各自的适用条件。前几节的数据处理以 pandas 为主其底层依赖 NumPy 的数组结构而线性代数、插值、优化与信号处理由 SciPy 提供图像读写与变换由 Pillow 提供。三者的分工为NumPy 提供数组与向量化运算SciPy 在其上提供数值算法Pillow 提供图像接口。本节不重复各库的基础教程而是按数组计算 → 数值算法 → 信号处理 → 图像处理的顺序说明常用接口的调用方式与适用条件并与本系列的 NumPy、SciPy、Pillow 专题博客互为补充。实现基于 NumPy 1.26、SciPy 1.11 与 Pillow 10.0运行环境为 Python 3.10OpenCV 4.8 为可选依赖。1 NumPy数组计算NumPy 的基本用法是以数组运算替代逐元素循环。借助广播机制形状不同的数组在满足广播规则时可直接进行逐元素运算无需显式复制importnumpyasnp rngnp.random.default_rng(42)Xrng.random((1000,50))XcX-X.mean(axis0)# 广播(1000,50) - (50,) 每列减均值outnp.empty_like(Xc)np.multiply(Xc,2,outout)# out 复用缓冲省一次内存分配anp.arange(6).reshape(2,3)print((a-a.mean(axis0)).round(2))[[-1.5 -1.5 -1.5] [ 1.5 1.5 1.5]]上述结果为按列去均值a.mean(axis0)得到形状为 (3,) 的行均值与形状 (2,3) 的数组相减时按列广播。向量化与广播的作用在于避免 Python 层循环减少解释执行开销其性能提升幅度取决于运算类型与数据规模因此加速比应以实际测量为准。out参数用于复用已有数组的存储空间减少内存分配。2 SciPy线性代数线性代数中的常见操作是求解线性方程组Ax b。直接计算A的逆再与b相乘的做法在数值上不稳定当A接近奇异时其逆矩阵的元素会被放大求解结果的误差随之增大。矩阵的性态可用条件数衡量条件数越大表示矩阵越接近奇异fromscipyimportlinalgdefrobust_solve(A,b):condnp.linalg.cond(A)ifcond1e10:# 病态改用最小二乘returnlinalg.lstsq(A,b)[0],{cond:cond,method:lstsq}returnlinalg.solve(A,b),{cond:cond,method:solve}函数按条件数选择解法条件数较小时使用solve基于 LU 分解求解方阵方程组条件数较大时改用lstsq最小二乘在方程无精确解或矩阵病态时给出误差最小的解。条件数阈值为经验取值实际使用时可按问题的精度要求调整。3 SciPy插值与优化插值用于在已知数据点之间估计中间取值。interp1d已不推荐使用宜改用CubicSpline三次样条在相邻节点处保证函数值与一阶、二阶导数连续插值曲线较为平滑。需注意插值仅适用于数据范围之内超出范围的外推结果不再受数据约束fromscipyimportinterpolate,optimize csinterpolate.CubicSpline(x,y)# 推荐interp1d 已弃用resoptimize.minimize(fun,x0,jacgrad,methodL-BFGS-B,boundsbounds)ifnotres.success:raiseRuntimeError(res.message)# 必须检查收敛不能假定成功优化部分使用minimize求解无约束或有界约束问题methodL-BFGS-B适用于带边界的可微目标函数jac提供梯度可加快收敛。优化结果需检查res.success数值优化可能在迭代次数或精度限制下提前终止未检查即使用结果会引入错误。4 信号处理滤波与频谱滤波是对序列进行频域或时域的局部处理。高阶滤波器若直接以传递函数系数b, a实现其极点分布会导致数值不稳定因此改用二阶节SOS形式fromscipyimportsignal,fft sossignal.butter(6,20,btypelow,fsfs,outputsos)# SOS高阶滤波更稳定ysignal.sosfiltfilt(sos,x)# 零相位滤波避免端点失真ampnp.abs(fft.rfft(y))/len(y)*2# 实信号用 rfft 归一化sosfiltfilt对序列作前向与反向两次滤波从而抵消滤波引入的相位偏移零相位滤波代价是无法用于在线处理仅适用于已获得完整序列的场景。频谱部分使用rfft实信号的频谱具有共轭对称性只需计算一半频点除以序列长度并乘以 2可将幅值归一化到与时域幅值一致的量级。5 Pillow图像处理与批量规格统一单张图像的读取与变换较为直接实际工程中的难点在于批量处理时的规格统一。以下函数将输入图像统一为固定尺寸的方形画布并输出处理结果路径frompathlibimportPathfromPILimportImage,ImageOpsdefnormalize_image(src:Path,dst:Path,size512):withImage.open(src)asim:imImageOps.exif_transpose(im)# 按 EXIF 纠方向否则可能躺倒imim.convert(RGB)# 去 alpha避免透明变黑im.thumbnail((size,size),Image.LANCZOS)# 等比缩放 抗锯齿canvasImage.new(RGB,(size,size),(0,0,0))canvas.paste(im,((size-im.width)//2,(size-im.height)//2))dst.parent.mkdir(parentsTrue,exist_okTrue)canvas.save(dst,formatPNG)returnstr(dst)该函数依次完成四项处理按 EXIF 信息纠正方向部分图像的像素数据与显示方向不一致转换为 RGB 以去除透明通道避免透明区域在后续合成中变为黑色等比缩放至画布范围内thumbnail保持宽高比LANCZOS为重采样算法在以黑色铺底的方形画布上居中粘贴使输出尺寸统一。批量处理时可用进程池并行执行上述函数并对结果作质量校验检查文件可正常打开、尺寸符合规格fromconcurrent.futuresimportProcessPoolExecutor IMG_EXT{.jpg,.jpeg,.png,.bmp,.webp}对 JPEG 大图可在解码阶段即降采样以减少内存占用im.draft(RGB, (512, 512))会在读取时按比例缩小而非读取完整分辨率后再缩放。6 小结NumPy 提供数组与向量化运算广播机制使不同形状的数组可直接参与逐元素计算out参数用于复用存储空间。SciPy 在此基础上提供数值算法线性代数部分按条件数在solve与lstsq之间选择解法避免直接求逆插值使用CubicSpline且仅适用于数据范围之内优化需检查收敛标志后再使用结果。信号处理使用二阶节形式的高阶滤波与零相位滤波频谱分析对实信号使用rfft并作幅值归一化。Pillow 用于图像读写与变换批量处理时需统一尺寸、方向与颜色模式并对结果作质量校验。至此本系列以实习僧 · 互联网 IT 类实习岗位数据为线索走完了从环境搭建、数据获取与加工到分析与建模、数值与图像处理的完整链路。各篇共享若干共同约定处理前先确定统计范围与口径结论以此为前提预处理参数仅在训练集估计特征文本去除目标信息原始数据与原文保持只读口径调整另行留档方法前提无法满足时以修订并记录的方式处理随机种子、依赖版本、阶段编号与回归锚点统一固定以保证结果可复现。采集环节需遵守目标网站的使用协议并控制访问频率文中不公开原始数据以及任何包含个人或公司敏感信息的明细。全系列完7 延伸参考相关文章0. NumPy 系列教程、NumPy 数据分析与图像处理入门、SciPy 信号处理解析、SciPy 插值方法详解、Pillow 基础图像操作与数据预处理、Pillow 图像分割、切片与拼接处理NumPy / SciPy / Pillow 官方文档上一篇08 机器学习建模与实验评估

相关新闻

【学习记录】DAP调试器电路原理图完全详解:从STM32最小系统到SWD调试接口

【学习记录】DAP调试器电路原理图完全详解:从STM32最小系统到SWD调试接口

【学习记录】DAP调试器电路原理图完全详解:从STM32最小系统到SWD调试接口 DAP调试器(CMSIS-DAP)是嵌入式开发中最常用的调试工具之一。它本质上是一个小型的STM32最小系统 USB接口 目标调试接口。本文从原理图角度,逐模块拆解DA…

2026/10/15 3:56:45 阅读更多 →
Python做微信机器人:个人微信API最小收发闭环实战

Python做微信机器人:个人微信API最小收发闭环实战

用 Python 做微信机器人,最常见的起步方式是:找个示例、复制一段发送代码、在测试好友上点一点。 能发出去当然高兴,但一接到真实业务——自动回、CRM、AI——就会发现:收不稳、回双份、偶发找不到人。 个人微信 API 实战&#x…

2026/10/15 3:56:45 阅读更多 →
IDEA 的命令补全又进化了

IDEA 的命令补全又进化了

我们先来还原一个极其真实的场景 你正在写一个 Java 类,突然想重构一个方法。你明明知道 IDEA 能做到,甚至昨天刚用过。但此刻,你的大脑一片空白——快捷键是什么来着? CtrlAltShiftT?还是 CtrlAltM? 你开始…

2026/10/15 3:55:44 阅读更多 →

最新新闻

模板代码生成工具:从元数据到可用接口的完整实现

模板代码生成工具:从元数据到可用接口的完整实现

1. 为什么需要模板代码生成工具:一大半重复代码其实不该手写做后端开发的朋友应该都有过这种体验:新项目启动,建表、写实体、写Mapper、写Service接口和实现、写Controller,然后前端再把列表页、表单页、弹窗、状态标签挨个撸一遍…

2026/10/15 4:45:53 阅读更多 →
桶排序全解析:原理、复杂度与工程实践

桶排序全解析:原理、复杂度与工程实践

1. 从"把数据扔进格子里"说起:桶排序的第一性原理如果你接触排序算法有一阵子,大概率听说过这句话:"桶排序在数据分布均匀的时候能做到接近O(n)"。但很多人学完快排、归并之后,对桶排序的印象只剩下一个模糊的…

2026/10/15 4:45:53 阅读更多 →
ET 200MP模拟量输出模块AQ 4xU/I ST选型接线调试指南

ET 200MP模拟量输出模块AQ 4xU/I ST选型接线调试指南

简介:西门子SIMATIC S7-1500/ET 200MP模拟量输出模块AQ 4xU/I ST设备手册,面向工业自动化领域的工程技术人员、系统集成商与运维人员。内容聚焦模拟量输出模块在制造、能源、交通等场景下的选型、接线、参数设置与调试问题,帮助用户实现精准的…

2026/10/15 4:45:53 阅读更多 →
Windows开机自启全攻略:启动文件夹、注册表、任务计划与服务详解

Windows开机自启全攻略:启动文件夹、注册表、任务计划与服务详解

1. 开机自启这件事,远不止把快捷方式拖进启动文件夹那么简单很多人第一次接触开机自启,都是因为某个小工具每次重启后都要手动打开,烦得不行。于是上网一搜,看到最多的答案就是“把快捷方式拖进启动文件夹”,照做之后确…

2026/10/15 4:45:53 阅读更多 →
基于地点相似度的POI推荐与路径重组MATLAB实现

基于地点相似度的POI推荐与路径重组MATLAB实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 4:45:53 阅读更多 →
延迟优化实战:从毫秒级到微秒级的系统性能提升路径

延迟优化实战:从毫秒级到微秒级的系统性能提升路径

1. 我为什么折腾到微秒级:被延迟拖垮的业务,往往都死得悄无声息很多人做性能优化,跑到“毫秒级”就收工了,觉得接口P99能压到5ms以内已经是了不起的成就。但如果你在真正的高并发业务链路里待过,就会明白:当…

2026/10/15 4:44:53 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →