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% 的加速。真正的稀疏输入矩阵也应受益于改进的草图算法,该算法现在以 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 已在新模块 scipy.optimize.cython_optimize 中通过 cimport 提供。此 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 起已被弃用。类似地,自 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 为真。
如果 xdata 和 ydata 的数据类型不同,scipy.optimize.curve_fit 不再会失败;它们现在都会自动转换为 float64。
包括 binary_erosion、binary_closing 和 binary_dilation 在内的 scipy.ndimage 函数现在要求迭代次数为整数值,这解决了许多报告的问题。
修复了 scipy.stats.wilcoxon 中 zero_method == "pratt" 情况下的正态近似。
修复了由于 stats 分布在 _argcheck() 内部设置成员变量而导致的错误概率、广播问题和线程安全问题。
scipy.optimize.newton 现在在以下情况下会正确地引发 RuntimeError:当使用默认参数且导数值为零时(这是未能收敛的一种特殊情况)。
现已发布工具链路线图草案,其中包含了 Python 版本、C 标准和 NumPy 版本的兼容性计划。