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.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/ 的基于网页的文档编辑器中注册一个用户名,并修正这些问题。

运行测试#

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

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

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

我们还大大提高了测试覆盖率。在0.6.0版本中,单元测试仅有2000多个;这个版本几乎翻倍,达到了4000多个单元测试。

构建 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,而剩余的代码则被删除,因为这些功能已被其他代码所取代。

稀疏矩阵#

稀疏矩阵经历了广泛的改进。现在支持整数数据类型,如 int8uint32 等。新增了两种稀疏格式:

  • 新类 dia_matrix : 稀疏对角格式

  • 新类 bsr_matrix : 块 CSR 格式

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

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

  • sparse.bmat : numpy.bmat 的稀疏版本

  • sparse.vstack : numpy.vstack 的稀疏版本

  • sparse.hstack : numpy.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位整数

  • loadmat 的新 struct_as_record 关键字参数,该参数将 MATLAB 中的结构数组加载为 numpy 中的记录数组

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

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

新的层次聚类模块#

此模块为 scipy.cluster 包添加了新的层次聚类功能。函数接口类似于 MATLAB(TM) 的 Statistics Toolbox 提供的函数,以帮助更容易地迁移到 NumPy/SciPy 框架。实现的链接方法包括单链接、完全链接、平均链接、加权、质心、中位数和沃德方法。

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

新空间包#

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

它还包括一个 distance 模块,包含一组用于计算向量之间距离和不相似度的函数,这对于空间统计、聚类和kd-树非常有用。提供的距离和不相似度函数包括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中。除非另有说明,所有常数均采用国际单位制。还提供了几个辅助函数。

新的径向基函数模块#

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 用户可能需要修改其代码。

编织清理#

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 中)中进行此更改。