SciPy 1.3.0 发行说明#
SciPy 1.3.0 是 5 个月辛勤工作的结晶。它包含许多新功能、大量的错误修复、改进的测试覆盖率以及更好的文档。此版本中进行了一些 API 变更,具体如下文所述。我们鼓励所有用户升级到此版本,因为其中包含大量的错误修复和优化。在升级之前,建议用户检查自己的代码是否没有使用已弃用的 SciPy 功能(为此,请运行您的代码并使用 python -Wd 查看是否有 DeprecationWarning)。我们的开发重心现在将转移到 1.3.x 分支上的错误修复版本,以及在 master 分支上添加新功能。
此版本需要 Python 3.5+ 和 NumPy 1.13.3 或更高版本。
若要在 PyPy 上运行,需要 PyPy3 6.0+ 和 NumPy 1.15.0。
此版本的亮点#
新增了三个
stats函数,重写了pearsonr,并实现了 Kolmogorov-Smirnov 双样本检验的精确计算。在
scipy.optimize中为有界标量函数求根器引入了新的 Cython API。显著提升了
CSR和CSC稀疏矩阵索引的性能。在
RotationSpline中增加了对具有连续角速度和加速度的旋转插值的支持。
新功能#
scipy.interpolate 改进#
引入了一个新类 CubicHermiteSpline。它是一个分段三次插值器,可以匹配观测值和一阶导数。现有的三次插值器 CubicSpline、PchipInterpolator 和 Akima1DInterpolator 已成为 CubicHermiteSpline 的子类。
scipy.io 改进#
对于属性关系文件格式 (ARFF),scipy.io.arff.loadarff 现在支持关系属性。
scipy.io.mmread 现在可以解析包含空行的 Matrix Market 格式文件。
scipy.linalg 改进#
为 ?syconv 例程添加了封装,这些例程用于将三角矩阵分解得到的对称矩阵转换为两个矩阵,反之亦然。
scipy.linalg.clarkson_woodruff_transform 现在使用一种利用稀疏性的算法。对于稠密输入矩阵,这可以提供 60-90% 的加速。真正的稀疏输入矩阵也应该受益于改进后的草图 (sketch) 算法,该算法现在可以在 O(nnz(A)) 时间内正确运行。
新增了计算对称 Fiedler 矩阵和 Fiedler 伴随矩阵的函数,分别命名为 scipy.linalg.fiedler 和 scipy.linalg.fiedler_companion。它们可用于求根。
scipy.ndimage 改进#
高斯滤波器的性能在某些情况下可能提高一个数量级,这得益于移除了对 np.polynomial 的依赖。例如,这可能会影响 scipy.ndimage.gaussian_filter。
scipy.optimize 改进#
scipy.optimize.brute 最小化器获得了一个新关键字 workers,可用于并行计算。
在新的模块 scipy.optimize.cython_optimize 中,通过 cimport 提供了用于 scipy.optimize 中有界标量函数求根器的 Cython API。此 API 可与 nogil 和 prange 一起使用,以遍历函数参数数组,从而比纯 Python 更快地求解根数组。
'interior-point' 现在是 linprog 的默认方法。当所需的 scikits(scikit-umfpack 和 scikit-sparse)可用时,'interior-point' 现在会使用 SuiteSparse 来处理稀疏问题。在基准测试问题 (gh-10026) 中,执行时间通常减少了 2-3 倍。此外,还添加了新的 method='revised simplex'。它不如 method='interior-point' 快速或稳健,但它是旧版 method='simplex' 的更快速、更稳健且精度相当的替代方案。
differential_evolution 现在可以使用 Bounds 类来指定函数优化参数的边界。
scipy.optimize.dual_annealing 的性能提升,与部分内部代码的向量化有关。
scipy.signal 改进#
scipy.signal.cont2discrete 现在支持两种额外的离散化方法:impulse 和 foh。
scipy.signal.firls 现在使用更快的求解器。
scipy.signal.detrend 在某些情况下现在具有更低的物理内存占用,可以使用新的 overwrite_data 关键字参数来利用这一点。
scipy.signal.firwin 的 pass_zero 参数现在接受新的字符串参数,允许指定所需的滤波器类型:'bandpass'、'lowpass'、'highpass' 和 'bandstop'。
scipy.signal.sosfilt 的性能可能有所提升,原因在于算法中对全局解释器锁 (GIL) 的占用减少了。
scipy.sparse 改进#
向 csgraph.dijsktra 添加了一个新关键字,允许用户查询到任何传入索引的最短路径,而不是到每个传入索引的最短路径。
scipy.sparse.linalg.lsmr 在大型问题上的性能提高了约 10%。
scipy.sparse.linalg.lobpcg 所使用的算法性能得到了改进,且物理内存占用降低。
CSR 和 CSC 稀疏矩阵花式索引的性能得到了显著提升。
scipy.spatial 改进#
scipy.spatial.ConvexHull 现在有一个 good 属性,可以与 QGn Qhull 选项一起使用,以确定凸包的哪些外部面可以从外部查询点看到。
scipy.spatial.cKDTree.query_ball_point 已经现代化,使用了更新的 Cython 特性,包括 GIL 处理和异常转换。修复了 return_sorted=True 和标量查询的一个问题,并添加了一个名为 return_length 的新模式。return_length 仅计算返回索引列表的长度,而不是每次都分配数组。
scipy.spatial.transform.RotationSpline 已添加,以实现具有连续角速度和加速度的旋转插值。
scipy.stats 改进#
添加了一个计算 Epps-Singleton 检验统计量的新函数 scipy.stats.epps_singleton_2samp,可应用于连续和离散分布。
添加了新函数 scipy.stats.median_absolute_deviation 和 scipy.stats.gstd(几何标准差)。scipy.stats.combine_pvalues 方法现在支持 pearson、tippett 和 mudholkar_george p值组合方法。
scipy.stats.ortho_group 和 scipy.stats.special_ortho_group 的 rvs(dim) 函数算法从 O(dim^4) 实现更新为 O(dim^3),这对于 dim>100 的情况有显著的速度提升。
重写了 scipy.stats.pearsonr,以使用更稳健的算法,对潜在病态输入提供有意义的异常和警告,并修复了原始实现中报告的至少五个单独问题。
提高了 hypergeom.logcdf 和 hypergeom.logsf 的精度。
为 Kolmogorov-Smirnov (KS) 双样本检验添加了精确计算,替换了之前针对双侧检验 stats.ks_2samp 的近似计算。还添加了单侧双样本 KS 检验,并为 stats.ks_2samp 添加了关键字 alternative。
向后不兼容的变更#
scipy.interpolate 变更#
scipy.interpolate 中的函数(spleval, spline, splmake, spltopp)以及 scipy.misc 中的函数(bytescale, fromimage, imfilter, imread, imresize, imrotate, imsave, imshow, toimage)已被移除。前者自 v0.19.0 起已弃用,后者自 v1.0.0 起已弃用。同样,scipy.misc 中的别名(comb, factorial, factorial2, factorialk, logsumexp, pade, info, source, who)自 v1.0.0 起已弃用并被移除。SciPy v1.1.0 文档可用于追踪已重新定位函数的导入位置。
scipy.linalg 变更#
对于 pinv, pinv2, 和 pinvh,为了保持一致性,默认截止值已更改(实际值请参见文档)。
scipy.optimize 变更#
linprog 的默认方法现在是 'interior-point'。该方法的稳健性和速度是有代价的:解可能不符合机器精度,或者不对应于由约束定义的多面体的顶点。要恢复到原始单纯形法,请包含参数 method='simplex'。
scipy.stats 变更#
之前,ks_2samp(data1, data2) 会运行双侧检验并返回近似 p 值。新的签名 ks_2samp(data1, data2, alternative="two-sided", method="auto") 默认仍然运行双侧检验,但对于小样本返回精确 p 值,对于大样本返回近似值。method="asymp" 等同于旧版本,但 auto 是更好的选择。
其他变更#
我们的教程中扩展了关于全局优化器的新章节。
对 stats.distributions 教程进行了重构。
scipy.optimize 现在可以正确地将有界标量函数求根器的结果收敛标志设置为 CONVERR(即收敛错误),如果超过了最大迭代次数、disp 为假且 full_output 为真。
scipy.optimize.curve_fit 如果 xdata 和 ydata 数据类型不同,将不再失败;它们现在会自动转换为 float64。
scipy.ndimage 函数(包括 binary_erosion, binary_closing, 和 binary_dilation)现在要求迭代次数必须为整数,这缓解了许多报告的问题。
修复了 scipy.stats.wilcoxon 中当 zero_method == "pratt" 时的正态近似问题。
修复了概率计算错误、广播问题以及与 stats 分布在 _argcheck() 内部设置成员变量相关的线程安全问题。
scipy.optimize.newton 现在在以下情况下会正确引发 RuntimeError:当使用默认参数且导数值为零时(这是未能收敛的一种特殊情况)。
一份草案工具链路线图现已发布,列出了包括 Python 版本、C 标准和 NumPy 版本在内的兼容性计划。