SciPy 1.2.0 发布说明#
SciPy 1.2.0 是 6 个月辛勤工作的结晶。它包含许多新特性、大量错误修复、改进的测试覆盖率和更好的文档。此版本中有许多已废弃的功能和 API 变更,这些内容在下文进行了说明。建议所有用户升级到此版本,因为它包含大量错误修复和优化。在升级之前,我们建议用户检查自己的代码是否使用了已废弃的 SciPy 功能(为此,请使用 python -Wd
运行您的代码并检查是否存在 DeprecationWarning
)。我们的开发重心现在将转移到 1.2.x 分支上的错误修复版本以及 master 分支上新功能的添加。
此版本要求 Python 2.7 或 3.4+ 以及 NumPy 1.8.2 或更高版本。
注意
这将是支持 Python 2.7 的最后一个 SciPy 版本。因此,1.2.x 系列将成为长期支持 (LTS) 版本;我们将回溯性地修复错误,直到 2020 年 1 月 1 日。
在 PyPy 上运行需要 PyPy3 6.0+ 和 NumPy 1.15.0。
本次发布亮点#
一维求根改进,新增求解器
toms748
和统一接口root_scalar
新增
dual_annealing
优化方法,结合了随机搜索和局部确定性搜索新增优化算法
shgo
(单纯同调全局优化),用于无导数优化问题scipy.spatial.transform
中提供了一类新的基于四元数的变换
新特性#
scipy.ndimage
改进#
scipy.ndimage.rotate
的 mirror
、wrap
和 reflect
模式已添加正确的样条系数计算功能。
scipy.fftpack
改进#
scipy.fftpack
现在支持 DCT-IV、DST-IV、DCT-I 和 DST-I 正交化。
scipy.interpolate
改进#
scipy.interpolate.pade
现在接受一个用于分子阶数的新参数。
scipy.cluster
改进#
scipy.cluster.vq.kmeans2
获得了一种新的初始化方法:kmeans++。
scipy.special
改进#
函数 softmax
已添加到 scipy.special
。
scipy.optimize
改进#
一维非线性求解器已获得统一接口 scipy.optimize.root_scalar
,类似于多维求解器的 scipy.optimize.root
接口。scipy.optimize.root_scalar(f, bracket=[a ,b], method="brenth")
等效于 scipy.optimize.brenth(f, a ,b)
。如果未指定 method
,则将根据区间和可用导数的数量选择一个合适的方法。
Alefeld、Potra 和 Shi 的所谓算法 748,用于在封闭区间内求根的方法已作为 scipy.optimize.toms748
添加。该方法能保证收敛到根,并且每次函数评估的收敛速度约为 1.65(对于行为良好的函数)。
differential_evolution
现在具有 updating
和 workers
关键字。第一个选项选择是连续更新最佳解向量(默认),还是每代更新一次。连续更新可以加快收敛速度。workers
关键字接受一个 int
或类似映射的可调用对象,并使求解器并行化(副作用是每代更新一次)。提供一个 int
会在 N 个并行部分中评估试探解。提供一个类似映射的可调用对象则允许使用其他并行化方法(例如 mpi4py
或 joblib
)。
dual_annealing
(以及下文的 shgo
)是一种强大的新型通用全局优化 (GO) 算法。dual_annealing
利用两个退火过程来加速目标数学函数向全局最小值的收敛。第一个退火过程控制随机马尔可夫链搜索,第二个退火过程控制确定性最小化。因此,双退火是一种有效利用随机搜索和局部确定性搜索的混合方法。
shgo
(单纯同调全局优化) 是一种类似的算法,适用于解决黑箱和无导数优化 (DFO) 问题。该算法通常在有限时间内收敛到全局解。收敛性适用于非线性不等式和等式约束。除了返回一个全局最小值外,该算法还在每次迭代后返回找到的任何其他全局和局部最小值。这使其在探索域中的解时非常有用。
scipy.optimize.newton
现在可以接受标量或数组。
MINPACK
的使用现在是线程安全的,因此 MINPACK
+ 回调可以在多个线程上使用。
scipy.signal
改进#
数字滤波器设计函数现在包含一个用于指定采样率的参数。以前,数字滤波器只能使用归一化频率进行指定,但不同的函数使用不同的刻度(例如 butter
为 0 到 1,而 freqz
为 0 到 π),这导致了错误和混淆。有了 fs
参数,现在可以直接将普通频率输入函数中,归一化在内部处理。
find_peaks
和相关函数在峰值属性具有意外值(例如,显著性为 0)时不再引发异常,而是发出 PeakPropertyWarning
警告。
新关键字参数 plateau_size
已添加到 find_peaks
。plateau_size
可用于根据峰值平顶的长度来选择峰值。
scipy.signal
中的 welch()
和 csd()
方法现在支持使用 average='mean'
关键字计算中值平均 PSD。
scipy.sparse
改进#
scipy.sparse.bsr_matrix.tocsr
方法现在直接实现,而不是通过 COO 格式转换,并且 scipy.sparse.bsr_matrix.tocsc
方法现在也通过 CSR 转换而不是 COO 路由。两种转换的效率现在都得到了提高。
scipy.sparse.linalg
中 SuperLU 或 UMFPACK 求解器在处理非规范格式矩阵时崩溃的问题已修复。求解器包装器在调用 SuperLU 或 UMFPACK 求解器之前会在必要时将矩阵规范化。
scipy.sparse.linalg.lobpcg() 的 largest
选项已修复,以使其行为正确(符合预期)。特征值的顺序与 ARPACK 求解器(eigs()
)保持一致,即最小特征值升序排列,最大特征值降序排列。
scipy.sparse.random
函数现在速度更快,并且通过将适当的值传递给 dtype
参数,还支持整数和复数值。
scipy.spatial
改进#
函数 scipy.spatial.distance.jaccard
已修改,在比较两个全零向量时返回 0 而不是 np.nan
。
已在 scipy.spatial.distance.jensenshannon
下添加了对 Jensen Shannon 距离(散度平方根)的支持。
函数 scipy.spatial.cKDTree.query_ball_point() 添加了一个可选关键字,用于排序或不排序返回的索引。不排序索引可以加快调用速度。
scipy.spatial.transform
中提供了一类新的基于四元数的变换,包括旋转的球面线性插值 (Slerp
)、四元数与欧拉角之间的转换、一般旋转和反演功能 (spatial.transform.Rotation),以及 3D 旋转的均匀随机抽样 (spatial.transform.Rotation.random)。
scipy.stats
改进#
现在支持 Yeo-Johnson 幂变换(yeojohnson
、yeojohnson_llf
、yeojohnson_normmax
、yeojohnson_normplot
)。与 Box-Cox 变换不同,Yeo-Johnson 变换可以接受负值。
在新函数 rvs_ratio_uniforms
中添加了一种仅基于密度采样随机变量的通用方法。
已添加 Yule-Simon 分布(yulesimon
)——这是一种新的离散概率分布。
stats
和 mstats
现在可以使用一种新的回归方法 siegelslopes
,这是一种稳健的线性回归算法。
scipy.stats.gaussian_kde
现在能够处理加权样本,并且性能应有适度提升。
scipy.stats.levy_stable
现在支持 Levy 稳定参数估计、PDF 和 CDF 计算。
Brunner-Munzel 检验现在可在 stats
和 mstats
中作为 brunnermunzel
使用。
scipy.linalg
改进#
scipy.linalg.lapack
现在使用矩形全填充存储 (RFP) 暴露 LAPACK 例程,用于上三角、下三角、对称或厄米矩阵;上梯形肥矩阵 RZ 分解例程也已可用。
已废弃特性#
scipy.special
中的函数 hyp2f0
、hyp1f2
和 hyp3f0
已被废弃。
向后不兼容的变更#
现在要求 LAPACK 3.4.0 或更高版本。不再支持使用 Apple Accelerate 进行构建。
函数 scipy.linalg.subspace_angles(A, B)
现在对所有角度都返回正确结果。在此之前,该函数仅对大于 π/4 的角度返回正确值。
已移除对 Bento 构建系统的支持。Bento 多年来未进行维护,并且对 Python 3 或 wheel 的支持不佳,因此是时候将其移除了。
scipy.optimize.lingprog method=simplex
回调函数的所需签名已更改。在迭代开始之前,单纯形求解器首先将问题转换为标准形式,该标准形式通常与用户定义的问题没有相同的变量或约束。以前,单纯形求解器会将用户指定的回调函数传递给几个单独的参数,例如与此标准形式问题对应的当前解向量 xk
。不幸的是,标准形式问题与用户定义问题之间的关系未被文档化,限制了传递给回调函数的信息的实用性。
除了大量的错误修复更改之外,单纯形求解器现在将一个包含与用户定义问题直接对应的信息的单个 OptimizeResult
对象传递给用户指定的回调函数。在未来的版本中,此 OptimizeResult
对象可能会扩展,以包括更多信息,例如与标准形式问题对应的变量以及有关标准形式与用户定义问题之间关系的信息。
scipy.sparse.random
的实现已更改,这会影响 sparse.random
和 sparse.rand
在某些矩阵形状和给定种子下返回的数值。
scipy.optimize.newton
在 Halley 方法对收敛产生负面影响的情况下将不再使用该方法。