SciPy 0.7.0 发行说明#

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

请注意,在我们致力于 SciPy 1.0.0 版本的发布过程中,SciPy 仍被认为处于“Beta”状态。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 文档做贡献比以前更容易了:如果您发现其中一部分需要改进并想帮助我们,请在我们的基于 Web 的文档编辑器 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 是下一代构建系统,旨在通过集成 autoconf/automakeccache 的功能来取代古老的 Make。Scons 是用 Python 编写的,其配置文件是 Python 脚本。NumScons 旨在取代 NumPy 的自定义版本 distutils,提供更高级的功能,例如 autoconf、改进的 Fortran 支持、更多工具以及对 numpy.distutils/scons 协作的支持。

沙盒已移除#

在 2005 年将 SciPy 移植到 NumPy 时,有几个包和模块被移到了 scipy.sandbox。沙盒是那些正在快速开发且 API 处于变化中的包的演练场。它也是不完整代码存放的地方。沙盒很好地发挥了作用,但开始造成混乱。因此,scipy.sandbox 已被移除。大部分代码被移入了 scipy,一些代码被制成了 scikit,其余代码由于功能已被其他代码取代而被删除。

稀疏矩阵#

稀疏矩阵得到了广泛的改进。现在支持整数 dtype,例如 int8uint32 等。添加了两种新的稀疏格式:

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

  • 新类 bsr_matrix:分块 CSR 格式

添加了几个新的稀疏矩阵构造函数

  • sparse.kron:稀疏克罗内克积

  • 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) 函数一致。

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

统计包#

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

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

添加了 meanmedianvarstdcovcorrcoef 的弃用警告。这些函数应由 numpy 对应的函数替换。但请注意,这些函数的 scipy.stats 版本和 numpy 版本之间的一些默认选项有所不同。

stats.distributions 进行了大量错误修复:所有通用方法现在都可以正确工作,修复了各个分布中的几种方法。然而,高阶矩(skewkurtosis)和熵(entropy)仍存在一些问题。极大似然估计器 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 写入器

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

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

  • 字符串数组现在使用 dtype='U...' 而非 dtype=object

  • loadmat 不再压缩单维度(singleton dimensions),即默认 squeeze_me=False

新增层次聚类模块#

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

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

新增空间包#

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

它还包括一个 distance 模块,包含用于计算向量之间距离的距离和不相似度函数集,这对于空间统计、聚类和 kd-tree 非常有用。提供的距离和不相似度函数包括: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 提供了一系列物理常量和转换因子。这些常量取自 2002 年 CODATA 基础物理常量推荐值。可以在 physics.nist.gov/constants 找到。这些值存储在 physical_constants 字典中,作为一个包含值、单位和相对精度的元组(按此顺序)。除非另有说明,所有常量均使用 SI 单位。提供了几个辅助函数。

新增径向基函数模块#

scipy.interpolate 现在包含一个径向基函数(Radial Basis Function)模块。径向基函数可用于 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 数组)。如果用户的代码依赖于之前的行为,可能需要修改代码。

Weave 清理#

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

已知问题#

以下是 SciPy 0.7.0 的已知问题:

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

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