SciPy 1.3.0 发布说明#
SciPy 1.3.0 是 5 个月辛勤工作的结晶。它包含了许多新功能、大量的错误修复、改进的测试覆盖率和更好的文档。此版本中有一些 API 变更,下面将对此进行说明。我们鼓励所有用户升级到此版本,因为有许多错误修复和优化。在升级之前,我们建议用户检查他们的代码是否使用了已弃用的 SciPy 功能(为此,请使用 python -Wd 运行您的代码,并检查是否有 DeprecationWarning)。我们的开发重点现在将转移到 1.3.x 分支上的错误修复版本,以及在主分支上添加新功能。
此版本需要 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%的速度提升。真正稀疏的输入矩阵也应从改进的草图算法中受益,该算法现在正确地在 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 API 现在可以通过 cimport 在新的模块 scipy.optimize.cython_optimize 中使用。这个 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 已经现代化,使用了包括GIL处理和异常转换在内的一些较新的Cython特性。修复了 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 起已被弃用。同样,自 v1.0.0 起已被弃用的 scipy.misc 中的别名(comb、factorial、factorial2、factorialk、logsumexp、pade、info、source、who)也被移除。可以使用 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 的 dtypes 不同,不再失败;它们现在都被自动转换为 float64。
scipy.ndimage 函数,包括 binary_erosion、binary_closing 和 binary_dilation,现在需要一个整数值作为迭代次数,这解决了一些已报告的问题。
修复了在 scipy.stats.wilcoxon 中 zero_method == "pratt" 情况下的正态近似。
修复了与统计分布在 _argcheck() 内部设置成员变量相关的概率错误、广播问题和线程安全问题。
scipy.optimize.newton 现在在以下情况下正确地引发 RuntimeError:当使用默认参数并且如果获得值为零的导数时(这是未能收敛的特殊情况)。
现在提供了一个草案工具链路线图,概述了一个包括Python版本、C标准和NumPy版本的兼容性计划。