SciPy 数据集子模块 scipy.datasets 完全指南:数据获取、缓存管理与离线使用

发布时间:2026/9/22 19:08:37
SciPy 数据集子模块 scipy.datasets 完全指南:数据获取、缓存管理与离线使用
SciPy 数据集子模块 scipy.datasets 完全指南数据获取、缓存管理与离线使用【免费下载链接】scipySciPy library main repository项目地址: https://gitcode.com/gh_mirrors/sc/scipySciPy 数据集子模块 scipy.datasets 完全指南数据获取、缓存管理与离线使用scipy.datasets是 SciPy 官方提供的示例数据集子模块内置ascent、face、electrocardiogram三组图像与信号数据通过 Pooch 库实现按需下载、SHA256 校验与本地缓存。本文将结合仓库源码完整讲解其调用方式、缓存机制、平台缓存路径、download_all/clear_cache工具函数以及无网络环境下的离线部署方案帮助你在演示、测试与教程场景中正确使用这一模块。模块概览从 scipy.misc 到 scipy.datasets在 SciPy 1.10.0 版本之前示例图像如face、ascent由scipy.misc提供且数据文件直接打包在 SciPy 发行版中导致 sdist/wheel 体积膨胀。自 1.10.0 起SciPy 新增了独立的scipy.datasets子模块将数据文件从主仓库中解耦改为托管在外部、按需下载并缓存详见 1.10.0 版本说明同时废弃了scipy.misc中的同名接口。从源码看模块的公开接口定义在 scipy/datasets/init.py 中共导出 5 个名称分类接口说明数据集方法ascent()512×512 8 位灰度演示图像数据集方法face(grayFalse)1024×768 浣熊彩色/灰度图像数据集方法electrocardiogram()360 Hz 采样、5 分钟心电图信号工具方法download_all(pathNone)一次性下载全部数据集文件工具方法clear_cache(datasetsNone)清理缓存目录中的数据集文件快速上手三组内置数据集模块文档指出数据集方法可被直接调用为dataset-name()首次调用会通过网络下载数据文件并写入缓存之后每次调用直接读取缓存并返回numpy.ndarray。不同数据集方法的返回结构与数据类型可能不同具体差异见下文各节。ascent512×512 灰度演示图像ascent()返回 8 位灰度、512×512 的派生图像适合用于图像处理算法演示。源码位于 scipy/datasets/_fetchers.py其实现通过fetch_data(ascent.dat)获取本地文件路径再用pickle反序列化得到数组。import scipy.datasets ascent scipy.datasets.ascent() print(ascent.shape) # (512, 512) print(ascent.max()) # 255如需可视化import matplotlib.pyplot as plt plt.gray() plt.imshow(ascent) plt.show()face1024×768 浣熊图像face(grayFalse)返回一张 1024×768 的浣熊raccoon彩色图像是图像处理教程中的经典素材。实现细节位于 scipy/datasets/_fetchers.py数据文件face.dat为 bz2 压缩的字节流解压后reshape((768, 1024, 3))得到 RGB 数组。grayFalse默认返回(768, 1024, 3)的彩色uint8数组grayTrue返回(768, 1024)的 8 位灰度数组灰度转换系数为0.21*R 0.71*G 0.07*B。import scipy.datasets face scipy.datasets.face() print(face.shape) # (768, 1024, 3) face_gray scipy.datasets.face(grayTrue) print(face_gray.shape) # (768, 1024)electrocardiogram360 Hz 心电图信号electrocardiogram()返回一段 5 分钟、采样率 360 Hz 的心电图ECG信号共 108000 个采样点单位毫伏mV。该信号摘自 MIT-BIH 心律失常数据库 record 208MLII 导联19:35–24:35 片段该接口自 1.1.0 起已存在于scipy.misc中详见 源码注释同时包含典型心跳、早搏室性期前收缩及噪声伪影。源码中的信号还原逻辑值得关注scipy/datasets/_fetchers.py原始ecg.dat是 npz 文件读取后先由np.uint16转int再执行模数转换还原公式(ecg - 1024) / 200.0得到毫伏单位的浮点信号。from scipy.datasets import electrocardiogram ecg electrocardiogram() print(ecg.shape) # (108000,) print(ecg.mean()) # -0.16510875 print(ecg.std()) # 0.5992473991177294进一步分析信号形态与频谱如观察 60 Hz 工频干扰import numpy as np import matplotlib.pyplot as plt from scipy.signal import welch fs 360 time np.arange(ecg.size) / fs plt.plot(time, ecg) plt.xlabel(time in s) plt.ylabel(ECG in mV) plt.xlim(9, 10.2) # 正常窦性心律片段 plt.ylim(-1, 1.5) plt.show() f, Pxx welch(ecg, fsfs, nperseg2048, scalingspectrum) plt.semilogy(f, Pxx) plt.xlabel(Frequency in Hz) plt.ylabel(Power spectrum of the ECG in mV**2) plt.show()测试用例 scipy/datasets/tests/test_data.py 对上述形状、dtype、均值与标准差做了断言验证可作为复现参考。数据集获取与存储机制Pooch底层的下载与缓存引擎scipy.datasets依赖 Pooch 这一 Python 数据获取库完成文件拉取。模块文档明确指出所有数据集文件以dataset-name命名规范存放在 SciPy GitHub 组织下的独立仓库中如face数据位于scipy/dataset-face。Pooch 根据注册表registry中的文件名、SHA256 哈希与仓库 URL 完成下载与完整性校验下载后的文件保存在系统缓存目录scipy-data下。源码中 Pooch 客户端创建于 scipy/datasets/_fetchers.py使用pooch.os_cache(scipy-data)定位缓存目录同时传入 registry 与 urls。下载请求通过pooch.HTTPDownloader附带User-Agent: SciPy 版本号请求头scipy/datasets/_fetchers.py该改动是为了规避某些 CDN 对无 UA 请求返回 403 的问题对应 1.16.0 版本说明 中的相关修复。注册表文件名、SHA256 与 URL 的映射数据集注册表集中在 scipy/datasets/_registry.py 中包含三个关键结构registry文件名到 SHA256 哈希的映射用于下载后校验文件完整性registry_urls文件名到远程下载地址的映射method_files_map数据集方法名到其关联文件的映射供clear_cache定位待删除文件。以face.dat为例其 SHA256 为9d8b0b4d...2886下载地址指向dataset-face仓库的 raw 文件。任何下载内容的哈希不匹配都会被 Pooch 判定失败从而保证缓存数据的可信性。网络缓存路径分平台模块文档给出了各平台的默认缓存位置平台缓存路径macOS~/Library/Caches/scipy-dataLinux 及其他 Unix 系~/.cache/scipy-data或环境变量XDG_CACHE_HOME指定的位置WindowsC:\Users\user\AppData\Local\AppAuthor\scipy-data\Cache实现上路径统一由pooch.os_cache(scipy-data)生成Pooch 内部借助 appdirs/platformdirs 做平台适配因此实际路径以运行时检测结果为准。缓存命中后重复调用数据集方法不再发起网络请求。工具函数download_all 与 clear_cachedownload_all预下载全部数据集download_all(pathNone)用于一次性拉取scipy.datasets的全部数据文件。源码位于 scipy/datasets/_download_all.py遍历注册表中每个文件通过pooch.retrieve下载到指定目录默认即 Pooch 检测的系统缓存目录。from scipy import datasets # 下载到默认缓存位置 datasets.download_all() # 下载到当前目录 datasets.download_all(.)值得说明的是该文件同时支持作为独立脚本运行无需完整 SciPy 构建便于发行版打包场景预先下载数据规避打包期间禁止访问外网的限制python scipy/datasets/_download_all.py download_dir不传download_dir时默认使用 Pooch 的系统缓存目录scipy/datasets/_download_all.py。测试套件在模块级 fixture 中首先调用download_all()完成数据准备scipy/datasets/tests/test_data.py也印证了该函数的正确用法。clear_cache清理缓存文件clear_cache(datasetsNone)用于删除缓存的部分或全部数据集文件以释放磁盘空间或强制下次调用重新下载。核心逻辑在 scipy/datasets/_utils.py不传参或传None删除整个scipy-data缓存目录传单个可调用对象或可调用对象列表/元组根据method_files_map定位该数据集关联的文件并逐个删除传入不在映射中的方法名会抛出ValueError待删除文件不存在时会打印提示并跳过。from scipy import datasets datasets.ascent() datasets.clear_cache([datasets.ascent]) # 输出: Cleaning the file ascent.dat for dataset ascent测试用例 scipy/datasets/tests/test_data.py 覆盖了单个/多个方法、单方法多文件、错误方法名抛异常以及整体清理等分支可作为理解参数行为的参考。离线环境与受限网络下的使用对于无持续网络连接或安全策略限制外网的环境模块文档给出了离线方案将数据集仓库的全部内容手工放置到上述缓存目录中即可避免调用时的联网拉取错误。推荐流程如下在可联网机器上执行datasets.download_all()或运行python scipy/datasets/_download_all.py获取全部数据文件将文件整体复制到目标机器的缓存目录路径依据目标平台见上文表格目标机器上直接调用ascent()、face()、electrocardiogram()即可从缓存命中全程不联网。由于 Pooch 会依据注册表校验 SHA256手工放置的文件必须与注册表哈希一致文件内容未经修改即可满足否则会触发校验失败而非直接使用。依赖与版本注意点pooch是scipy.datasets的可选依赖未安装时调用数据集方法会抛出ImportError并提示pip install poochscipy/datasets/_fetchers.py。clear_cache在无platformdirsPooch 的传递依赖时同样会提示安装 poochscipy/datasets/_utils.py。三个数据集方法均以xp_capabilities(out_of_scopeTrue)标记表示它们不在 SciPy 的数组 API 兼容范围内见 1.17.0 版本说明即始终返回numpy.ndarray而非任意数组库对象。模块自 1.10.0 起提供若使用更早版本请继续使用scipy.misc中对应的已废弃接口。小结scipy.datasets通过「外部托管 Pooch 按需下载 SHA256 校验 本地缓存」的设计为 SciPy 的演示、测试与教程提供了统一的数据获取入口。理解其缓存路径、注册表机制以及download_all/clear_cache工具既能让你在多平台下自如管理数据也能在离线环境中正确预置缓存。相关实现均可进一步阅读 scipy/datasets/_fetchers.py、scipy/datasets/_registry.py 与 scipy/datasets/tests/test_data.py 加深理解。【免费下载链接】scipySciPy library main repository项目地址: https://gitcode.com/gh_mirrors/sc/scipy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考