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/automake 和 ccache 的功能来取代古老的 Make。Scons 是用 Python 编写的,其配置文件是 Python 脚本。NumScons 旨在取代 NumPy 的自定义版本 distutils,提供更高级的功能,例如 autoconf、改进的 Fortran 支持、更多工具以及对 numpy.distutils/scons 协作的支持。
沙盒已移除#
在 2005 年将 SciPy 移植到 NumPy 时,有几个包和模块被移到了 scipy.sandbox。沙盒是那些正在快速开发且 API 处于变化中的包的演练场。它也是不完整代码存放的地方。沙盒很好地发挥了作用,但开始造成混乱。因此,scipy.sandbox 已被移除。大部分代码被移入了 scipy,一些代码被制成了 scikit,其余代码由于功能已被其他代码取代而被删除。
稀疏矩阵#
稀疏矩阵得到了广泛的改进。现在支持整数 dtype,例如 int8、uint32 等。添加了两种新的稀疏格式:
新类
dia_matrix:稀疏对角线(DIAgonal)格式新类
bsr_matrix:分块 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)和熵(entropy)仍存在一些问题。极大似然估计器 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 中的记录数组(record arrays)字符串数组现在使用
dtype='U...'而非dtype=objectloadmat不再压缩单维度(singleton dimensions),即默认squeeze_me=False
新增层次聚类模块#
此模块为 scipy.cluster 包添加了新的层次聚类功能。函数接口与 MATLAB(TM) 统计工具箱提供的函数类似,以帮助更容易地迁移到 NumPy/SciPy 框架。实现的链接方法包括 single、complete、average、weighted、centroid、median 和 ward。
此外,还提供了几个用于计算不一致统计量、同源距离(cophenetic distance)以及后代之间最大距离的函数。fcluster 和 fclusterdata 函数将层次聚类转换为一组扁平聚类。由于这些扁平聚类是通过将树切割成森林来生成的,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 中)进行此更改。