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 的集成功能替换古老的 MakeScons 是用 Python 编写的,其配置文件是 Python 脚本。NumScons 旨在取代 NumPy 的自定义 distutils 版本,提供更高级的功能,例如 autoconf、改进的 Fortran 支持、更多工具以及对 numpy.distutils/scons 协作的支持。

沙盒已删除#

在 2005 年将 SciPy 移植到 NumPy 时,有几个包和模块被移动到了 scipy.sandbox。沙盒是正在快速开发且 API 处于变动中的包的临时存放地。它也是可能存在损坏代码的地方。沙盒很好地完成了它的使命,但开始造成混乱。因此,scipy.sandbox 被移除。大部分代码被移动到了 scipy 中,一些代码被做成了一个 scikit,其余代码则被直接删除,因为该功能已被其他代码取代。

稀疏矩阵#

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

  • 新类 dia_matrix:稀疏 DIAgonal 格式

  • 新类 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 写入器

  • 用于函数句柄和 64 位整数的 v5 读取器/写入器

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

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

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

新的层次聚类模块#

此模块向 scipy.cluster 包添加了新的层次聚类功能。函数接口与 MATLAB(TM) 的统计工具箱提供的函数类似,以帮助更轻松地迁移到 NumPy/SciPy 框架。实现的链接方法包括单链接、完全链接、平均链接、加权链接、质心链接、中位数链接和 ward 链接。

此外,还提供了一些用于计算不一致性统计信息、共表型距离以及后代之间的最大距离的函数。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 中,其中包含值、单位和相对精度,按此顺序排列。除非另有说明,否则所有常数均以 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 个以上的维度,并且轴关键字设置为非默认值,则 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 (std::labs) 的 weave 测试失败:这是一个 gcc 4.3 错误。一种解决方法是在 scipy/weave/blitz/blitz/funcs.h(第 27 行)中添加 #include <cstdlib>。您可以在已安装的 scipy(在 site-packages 中)进行更改。