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 现在支持关系属性 (relational attributes)。
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 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'。
由于算法中全局解释器锁 (GIL) 的持有时间减少,scipy.signal.sosfilt 的性能可能有所提高。
scipy.sparse 改进#
向 csgraph.dijsktra 添加了一个新关键字,允许用户查询到传入索引中“任意”一个的最短路径,而不是到“每一个”传入索引的最短路径。
scipy.sparse.linalg.lsmr 在处理大型问题时的性能提高了约 10%。
改进了 scipy.sparse.linalg.lobpcg 所用算法的性能并减少了其物理内存占用。
CSR 和 CSC 稀疏矩阵的花式索引 (fancy indexing) 性能得到了大幅提升。
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)也被移除。可使用 v1.1.0 的 SciPy 文档来追踪这些迁移函数的新导入位置。
scipy.linalg 变更#
为了保持一致性,更改了 pinv、pinv2 和 pinvh 的默认截止值 (cutoff values)(具体数值请参考文档)。
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 教程进行了重新编写。
在有界标量函数求根器中,如果超过了最大迭代次数、disp 为 false 且 full_output 为 true,scipy.optimize 现在会正确地将结果的收敛标志设置为 CONVERR (收敛错误)。
scipy.optimize.curve_fit 不再因为 xdata 和 ydata 的数据类型不同而失败;它们现在都会被自动转换为 float64。
包括 binary_erosion、binary_closing 和 binary_dilation 在内的 scipy.ndimage 函数现在要求迭代次数必须为整数,这解决了一些已报告的问题。
修复了 scipy.stats.wilcoxon 中当 zero_method == "pratt" 时的正态近似问题。
修复了由于统计分布在 _argcheck() 内部设置成员变量而导致的概率错误、广播问题和线程安全问题。
scipy.optimize.newton 现在在以下情况下会正确引发 RuntimeError:使用默认参数且导数值为零时(这是无法收敛的一种特殊情况)。
工具链路线图草案现已发布,制定了包括 Python 版本、C 标准和 NumPy 版本在内的兼容性计划。