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 之前的版本被视为“测试”阶段,但我们致力于尽可能减少其中的错误。例如,除了在此版本中修复了众多错误外,我们还将单元测试的数量比上一个版本增加了一倍。
然而,在 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 版本中只有 2000 多个单元测试;而此版本中单元测试数量几乎翻了一番,达到了 4000 多个。
构建 SciPy#
增加了对 NumScons 的支持。NumScons 是一个用于 NumPy/SciPy 的初步新构建系统,其核心使用 SCons。
SCons 是一套下一代构建系统,旨在取代传统的 Make,并集成了 autoconf/automake 和 ccache 的功能。Scons 使用 Python 编写,其配置文件即为 Python 脚本。NumScons 旨在取代 NumPy 定制版本的 distutils,提供更高级的功能,例如 autoconf、改进的 Fortran 支持、更多工具,以及对 numpy.distutils/scons 协作的支持。
移除沙盒(Sandbox)#
在 2005 年将 SciPy 移植到 NumPy 时,一些包和模块被移入了 scipy.sandbox。沙盒是那些处于快速开发阶段、API 尚不稳定的包的暂存区。它也是存放坏代码的地方。沙盒完成了它的使命,但开始引起混乱。因此,scipy.sandbox 已被移除。大部分代码被移入了 scipy,一些代码被改造成了 scikit,其余代码则被直接删除,因为其功能已被其他代码取代。
稀疏矩阵#
稀疏矩阵得到了极大的改进。现在支持 int8、uint32 等整数数据类型。增加了两种新的稀疏格式:
新类
dia_matrix:稀疏对角(DIAgonal)格式新类
bsr_matrix:分块 CSR(Block CSR)格式
增加了几个新的稀疏矩阵构造函数:
sparse.kron:稀疏克罗内克积sparse.bmat:numpy.bmat的稀疏版本sparse.vstack:numpy.vstack的稀疏版本sparse.hstack:numpy.hstack的稀疏版本
增加了提取子矩阵和非零值的功能:
sparse.tril:提取下三角sparse.triu:提取上三角sparse.find:查找非零值及其索引
csr_matrix 和 csc_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 中的对应函数,但尚未验证其接口和算法是否完全一致。
修复了统计函数的几个错误,其中 kstest 和 percentileofscore 获得了新的关键字参数。
为 mean、median、var、std、cov 和 corrcoef 添加了弃用警告。这些函数应替换为对应的 NumPy 函数。但请注意,这些函数在 scipy.stats 版本和 NumPy 版本之间,某些默认选项有所不同。
对 stats.distributions 进行了大量错误修复:现在所有通用方法均可正常工作,修正了个别分布中的几个方法。然而,在更高阶矩(skew、kurtosis)和熵方面仍存在一些问题。最大似然估计器 fit 在某些分布上不能直接开箱即用——在某些情况下,必须仔细选择起始值;而在其他情况下,最大似然方法的通用实现可能不是数值上最合适的估计方法。
我们预计在下一个 SciPy 版本中会有更多的错误修复、数值精度的提高和功能的增强。
IO 包重构#
NumPy 和 SciPy 中的 IO 代码正在进行大规模重构。NumPy 将承载用于读写 NumPy 数组的基本代码,而 SciPy 将承载用于各种数据格式(数据、音频、视频、图像、Matlab 等)的文件读写器。
scipy.io 中的几个函数已被弃用,并将于 0.8.0 版本中删除,包括 npfile、save、load、create_module、create_shelf、objload、objsave、fopen、read_array、write_array、fread、fwrite、bswap、packbits、unpackbits 和 convert_objectarray。其中一些函数已被 NumPy 的原生读写能力、内存映射能力或数组方法所取代。另一些函数已从 SciPy 移至 NumPy,因为基本数组的读写能力现在由 NumPy 处理。
Matlab (TM) 文件读写器有多项改进:
默认版本为 5
用于结构体、元胞数组和对象的 v5 写入器
用于函数句柄和 64 位整数的 v5 读写器
loadmat新增struct_as_record关键字参数,将 Matlab 中的结构体数组加载为 NumPy 中的记录数组字符串数组现在使用
dtype='U...'而不是dtype=objectloadmat不再压缩单例维度,即默认情况下squeeze_me=False
新的层次聚类模块#
此模块向 scipy.cluster 包添加了新的层次聚类功能。函数接口类似于 MATLAB(TM) 统计工具箱提供的函数,旨在促进向 NumPy/SciPy 框架的迁移。实现的链接方法包括单链接(single)、全链接(complete)、平均链接(average)、加权链接(weighted)、质心链接(centroid)、中值链接(median)和 Ward 链接(ward)。
此外,还提供了几个用于计算不一致统计量、Cophenetic 距离和后代之间最大距离的函数。fcluster 和 fclusterdata 函数将层次聚类转换为一组平面聚类(flat clusters)。由于这些平面聚类是通过将树切割成树林生成的,因此 leaders 函数接受链接和平面聚类,并查找森林中每棵树的根。ClusterNode 类将层次聚类表示为字段可导航的树对象。to_tree 将矩阵编码的层次聚类转换为 ClusterNode 对象。提供了在 MATLAB 和 SciPy 链接编码之间进行转换的例程。最后,dendrogram 函数使用 matplotlib 将层次聚类绘制为树状图。
新的空间(Spatial)包#
新的空间包包含一系列空间算法和数据结构,对空间统计和聚类应用非常有用。它包括用于计算精确和近似最近邻的快速编译代码,以及一个具有相同接口的纯 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)。提供了几个辅助函数。
新的径向基函数(RBF)模块#
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 的 bug。一个临时解决方法是在
scipy/weave/blitz/blitz/funcs.h(第 27 行)中添加#include <cstdlib>。您可以在已安装的 SciPy(在 site-packages 中)中进行此修改。