SciPy 0.7.0 发行说明#

SciPy 0.7.0 是 16 个月辛勤工作的结晶。它包含许多新功能、大量错误修复、改进的测试覆盖率和更好的文档。此版本中进行了一些弃用和 API 更改,以下有说明。建议所有用户升级到此版本,因为它包含大量的错误修复和优化。此外,我们的开发重点将转移到 0.7.x 分支上的错误修复版本,以及在开发主干上添加新功能。此版本需要 Python 2.4 或 2.5 以及 NumPy 1.2 或更高版本。

请注意,SciPy 仍被视为处于“Beta”状态,我们正在努力发布 SciPy 1.0.0。1.0.0 版本的发布将标志着 SciPy 开发的一个重要里程碑,在此之后更改包结构或 API 将变得更加困难。尽管这些 1.0 版之前的版本被视为处于“Beta”状态,但我们致力于使其尽可能没有错误。例如,除了修复此版本中的大量错误外,自上一个版本以来,我们还使单元测试的数量增加了一倍。

然而,在 1.0 版本发布之前,我们正在积极审查和完善其功能、组织和接口。这样做是为了使软件包尽可能连贯、直观和实用。为了实现这一目标,我们需要用户社区的帮助。具体来说,我们需要关于项目各个方面的反馈——从我们实现的算法到函数调用签名的细节,无所不包。

在过去一年中,我们看到社区参与度迅速提高,并且进行了大量基础设施改进,以降低贡献门槛(例如,更明确的编码标准、改进的测试基础设施、更好的文档工具)。在未来一年中,我们希望看到这种趋势继续下去,并邀请所有人更积极地参与进来。

Python 2.6 和 3.0#

已投入大量工作使 SciPy 与 Python 2.6 兼容;然而,在这方面仍存在一些问题。2.6 支持的主要问题是 NumPy。在 UNIX(包括 Mac OS X)上,NumPy 1.2.1 基本可用,但有一些注意事项。在 Windows 上,存在与编译过程相关的问题。即将发布的 NumPy 1.3 版本将解决这些问题。SciPy 0.7 2.6 支持的任何剩余问题将在错误修复版本中解决。

Python 3.0 完全不支持;它需要将 NumPy 移植到 Python 3.0。这需要巨大的努力,因为大量 C 代码必须被移植。向 3.0 的过渡仍在考虑中;目前,我们还没有这次过渡的时间表或路线图。

主要文档改进#

SciPy 文档得到了极大改进;您可以在线查看 HTML 参考手册或将其下载为 PDF 文件。新的参考指南是使用流行的 Sphinx 工具构建的。

此版本还包含一个更新的教程,该教程自 2005 年 SciPy 移植到 NumPy 以来一直未提供。尽管不全面,该教程展示了如何使用 SciPy 的几个基本部分。它还包含了来自 numarray 手册的 ndimage 文档。

尽管如此,文档方面仍需更多努力。幸运的是,现在为 SciPy 文档做贡献比以前更容易了:如果您发现其中某一部分需要改进,并希望帮助我们,请在我们的基于网络的文档编辑器 https://docs.scipy.org.cn/ 中注册用户名并更正问题。

运行测试#

NumPy 1.2 引入了一个基于 nose 的新测试框架。从该版本开始,SciPy 现在也使用新的 NumPy 测试框架。利用新测试框架需要 nose 0.10 或更高版本。新框架的一个主要优点是它极大地简化了单元测试的编写——考虑到测试数量的迅速增加,这已经取得了回报。要运行完整的测试套件

>>> import scipy
>>> scipy.test('full')

更多信息请参见NumPy/SciPy 测试指南

我们也大大提高了我们的测试覆盖率。0.6.0 版本中只有略多于 2,000 个单元测试;而此版本使该数量几乎翻倍,达到略多于 4,000 个单元测试。

构建 SciPy#

已添加对 NumScons 的支持。NumScons 是 NumPy/SciPy 的一个试验性的新构建系统,其核心使用 SCons

SCons 是一个下一代构建系统,旨在取代老牌的 Make,并集成了 autoconf/automakeccache 的功能。SCons 是用 Python 编写的,其配置文件是 Python 脚本。NumScons 旨在取代 NumPy 的自定义版本 distutils,提供更高级的功能,例如 autoconf、改进的 Fortran 支持、更多工具,并支持 numpy.distutils/scons 协作。

沙盒已移除#

2005 年将 SciPy 移植到 NumPy 时,一些包和模块被移入 scipy.sandbox。沙盒作为正在快速开发且 API 不断变化的包的暂存区。它也是损坏代码的存放地。沙盒很好地完成了其使命,但开始造成混淆。因此 scipy.sandbox 被移除。大部分代码被移入 scipy,一些代码被制作成 scikit,其余代码被直接删除,因为其功能已被其他代码取代。

稀疏矩阵#

稀疏矩阵得到了广泛改进。现在支持 int8uint32 等整数 dtype。新增了两种稀疏格式

  • 新类 dia_matrix:稀疏对角线格式

  • 新类 bsr_matrix:块 CSR 格式

新增了几个稀疏矩阵构造函数

  • sparse.kron:稀疏 Kronecker 积

  • sparse.bmatnumpy.bmat 的稀疏版本

  • sparse.vstacknumpy.vstack 的稀疏版本

  • sparse.hstacknumpy.hstack 的稀疏版本

已添加子矩阵和非零值的提取功能

  • sparse.tril:提取下三角

  • sparse.triu:提取上三角

  • sparse.find:非零值及其索引

csr_matrixcsc_matrix 现在支持切片和高级索引(例如 A[1:3, 4:7]A[[3,2,6,8],:])。现在可以在所有稀疏格式之间进行转换

  • 使用成员函数,例如 .tocsr().tolil()

  • 使用 .asformat() 成员函数,例如 A.asformat('csr')

  • 使用构造函数 A = lil_matrix([[1,2]]); B = csr_matrix(A)

所有稀疏构造函数现在都接受密集矩阵和列表的列表。例如

  • A = csr_matrix( rand(3,3) )B = lil_matrix( [[1,2],[3,4]] )

spdiags 函数中对角线的处理方式已更改。它现在与 MATLAB(TM) 中同名函数保持一致。

对格式转换和稀疏矩阵算术运算进行了大量效率改进。最后,此版本包含了大量的错误修复。

统计包#

已添加掩码数组的统计函数,可通过 scipy.stats.mstats 访问。这些函数与其在 scipy.stats 中的对应函数相似,但尚未验证其接口和算法是否完全相同。

统计函数中的几个错误得到了修复,其中 kstestpercentileofscore 获得了新的关键字参数。

已添加针对 meanmedianvarstdcovcorrcoef 的弃用警告。这些函数应该被它们的 NumPy 对应函数取代。但请注意,这些函数在 scipy.stats 和 NumPy 版本之间的一些默认选项有所不同。

stats.distributions 进行了大量错误修复:所有通用方法现在都能正常工作,单个分布中的几个方法得到了修正。然而,在高阶矩(skewkurtosis)和熵方面仍存在一些问题。最大似然估计器 fit 对于某些分布无法直接使用——在某些情况下,起始值必须仔细选择,在其他情况下,最大似然法的通用实现可能不是数值上合适的估计方法。

我们预计在 SciPy 的下一个版本中会有更多的错误修复、数值精度提高和增强。

IO 包重构#

NumPy 和 SciPy 中的 IO 代码正在进行广泛的重构。NumPy 将作为读写 NumPy 数组的基本代码的存放地,而 SciPy 将包含各种数据格式(数据、音频、视频、图像、matlab 等)的文件读写器。

scipy.io 中的一些函数已被弃用,并将在 0.8.0 版本中移除,包括 npfilesaveloadcreate_modulecreate_shelfobjloadobjsavefopenread_arraywrite_arrayfreadfwritebswappackbitsunpackbitsconvert_objectarray。其中一些函数已被 NumPy 的原始读写功能、内存映射功能或数组方法取代。其他一些已从 SciPy 移至 NumPy,因为基本的数组读写功能现在由 NumPy 处理。

Matlab (TM) 文件读写器有了许多改进

  • 默认版本 5

  • v5 写入器支持结构体、单元格数组和对象

  • v5 读写器支持函数句柄和 64 位整数

  • 新增 struct_as_record 关键字参数到 loadmat,它将 matlab 中的结构体数组作为 numpy 中的记录数组加载

  • 字符串数组具有 dtype='U...' 而不是 dtype=object

  • loadmat 不再压缩单例维度,即默认情况下 squeeze_me=False

新层次聚类模块#

此模块为 scipy.cluster 包添加了新的层次聚类功能。函数接口与 MATLAB(TM) 统计工具箱中提供的函数类似,以帮助更轻松地迁移到 NumPy/SciPy 框架。实现的链接方法包括 single、complete、average、weighted、centroid、median 和 ward。

此外,还提供了几个用于计算不一致性统计量、同表现距离和后代之间最大距离的函数。fclusterfclusterdata 函数将层次聚类转换为一组扁平聚类。由于这些扁平聚类是通过将树切割成一片森林生成的,因此 leaders 函数接受一个链接和一个扁平聚类,并找到森林中每棵树的根。ClusterNode 类将层次聚类表示为可字段导航的树对象。to_tree 将矩阵编码的层次聚类转换为 ClusterNode 对象。提供了在 MATLAB 和 SciPy 链接编码之间进行转换的例程。最后,dendrogram 函数使用 matplotlib 将层次聚类绘制为树状图。

新空间包#

新的空间包包含一系列空间算法和数据结构,可用于空间统计和聚类应用。它包括用于计算精确和近似最近邻的快速编译代码,以及一个具有相同接口的纯 Python kd-tree,但支持注解和各种其他算法。随着用户需求变得更清晰,这两个模块的 API 可能会有所改变。

它还包含一个 distance 模块,其中包含一系列用于计算向量间距离的距离和相异度函数,这对于空间统计、聚类和 kd-trees 非常有用。提供的距离和相异度函数包括 Bray-Curtis、Canberra、Chebyshev、City Block、Cosine、Dice、Euclidean、Hamming、Jaccard、Kulsinski、Mahalanobis、Matching、Minkowski、Rogers-Tanimoto、Russell-Rao、Squared Euclidean、Standardized Euclidean、Sokal-Michener、Sokal-Sneath 和 Yule。

pdist 函数计算向量集中所有无序向量对之间的成对距离。cdist 计算两个向量集的笛卡尔积中所有向量对的距离。成对距离矩阵以压缩形式存储;只存储上三角部分。squareform 在方阵和压缩形式之间转换距离矩阵。

fftpack 包重构#

FFTW2、FFTW3、MKL 和 DJBFFT 封装器已被移除。只保留了 (NETLIB) fftpack。通过专注于一个后端,我们希望更轻松地添加新功能——例如 float32 支持。

新常数包#

scipy.constants 提供了一系列物理常数和转换因子。这些常数取自 CODATA 2002 年基本物理常数推荐值。它们可以在 physics.nist.gov/constants 找到。这些值以元组形式存储在字典 physical_constants 中,元组包含值、单位和相对精度——按此顺序。除非另有说明,所有常数均采用 SI 单位。提供了几个辅助函数。

新径向基函数模块#

scipy.interpolate 现在包含一个径向基函数模块。径向基函数可用于 n 维散射数据的平滑/插值,但在观察数据范围之外进行外推时应谨慎使用。

新复数ODE积分器#

scipy.integrate.ode 现在包含 ZVODE 复值常微分方程求解器(由 Peter N. Brown、Alan C. Hindmarsh 和 George D. Byrne 编写)的封装器。

新广义对称和厄米特特征值问题求解器#

scipy.linalg.eigh 现在包含更多 LAPACK 对称和厄米特特征值问题求解器的封装器。用户现在可以解决广义问题,只选择一个特征值范围,并选择使用更快的算法,但代价是内存使用量增加。scipy.linalg.eigh 的签名也相应地发生了变化。

插值包中的错误修复#

如果插值数据有超过 2 个维度,并且 axis 关键字设置为非默认值,scipy.interpolate.interp1d 的返回值形状曾经不正确。这个问题已经修复。此外,如果输入是标量,interp1d 现在返回一个标量(0D 数组)。scipy.interpolate.interp1d 的用户如果其代码依赖于之前的行为,则可能需要修改。

Weave 清理#

scipy.weave 进行了大量改进。blitz++ 已由作者重新授权,以兼容 SciPy 许可证。wx_spec.py 已被移除。

已知问题#

以下是 SciPy 0.7.0 的已知问题

  • Windows 上的 weave 测试失败:这些是已知问题,正在修订中。

  • 使用 gcc 4.3 时的 weave 测试失败(std::labs):这是 gcc 4.3 的一个错误。一个解决方法是在 scipy/weave/blitz/blitz/funcs.h 文件(第 27 行)中添加 #include <cstdlib>。您可以在已安装的 SciPy(在 site-packages 中)中进行更改。