SciPy 0.19.0 发行说明#
SciPy 0.19.0 是 7 个月辛勤工作的结晶。它包含许多新功能、大量缺陷修复、改进的测试覆盖率以及更好的文档。此版本中进行了一些弃用和 API 更改,其详细信息记录在下方。我们鼓励所有用户升级到此版本,因为其中包含大量的缺陷修复和优化。此外,我们的开发重心现在将转移到 0.19.x 分支上的缺陷修复版本,以及在 master 分支上添加新功能。
此版本需要 Python 2.7 或 3.4-3.6 以及 NumPy 1.8.2 或更高版本。
此版本的亮点包括
一个统一的外部函数接口层,
scipy.LowLevelCallable。通过 cimport scipy.special.cython_special,为
scipy.special模块中的标量、类型化版本的通用函数提供 Cython API。
新功能#
外部函数接口改进#
scipy.LowLevelCallable 提供了一个新的统一接口,用于在 Python 空间中包装底层编译的回调函数。它支持 Cython 导入的“api”函数、ctypes 函数指针、CFFI 函数指针、PyCapsules、Numba 准时编译(jitted)函数等。详见 gh-6509。
scipy.linalg 改进#
函数 scipy.linalg.solve 获得了另外两个关键字 assume_a 和 transposed。底层的 LAPACK 例程已被“专家”版本取代,现在还可以用于求解对称、埃尔米特(Hermitian)和正定系数矩阵。此外,病态矩阵现在会触发一个警告,并附带估计的条件数信息。旧的 sym_pos 关键字出于向后兼容的原因予以保留,但它与使用 assume_a='pos' 是完全等效的。此外,没有任何功能、仅打印 overwrite_<a, b> 值的 debug 关键字已被弃用。
新增了 scipy.linalg.matrix_balance 函数,以使用 LAPACK xGEBAL 例程系列执行所谓的矩阵平衡。这可用于通过对角相似变换使行范数和列范数近似相等。
函数 scipy.linalg.solve_continuous_are 和 scipy.linalg.solve_discrete_are 采用了数值上更稳定的算法。这些函数还可以求解广义代数矩阵黎卡提(Riccati)方程。此外,两者都增加了一个 balanced 关键字,用于开启和关闭平衡。
scipy.spatial 改进#
scipy.spatial.SphericalVoronoi.sort_vertices_of_regions 已用 Cython 重写以提高性能。
scipy.spatial.SphericalVoronoi 可处理超过 20 万个点(至少 1000 万个),并提高了性能。
新增了 scipy.spatial.distance.directed_hausdorff 函数,用于计算有向豪斯多夫(Hausdorff)距离。
scipy.spatial.cKDTree 的 count_neighbors 方法新增了通过新关键字 weights 和 cumulative 进行加权数对计数的功能。详见 gh-5647。
scipy.spatial.distance.pdist 和 scipy.spatial.distance.cdist 现在支持非双精度(non-double)自定义度量。
scipy.ndimage 改进#
回调函数 C API 在 Python 2.7 中支持 PyCapsules
多维滤波器现在允许为不同的轴设置不同的外推模式。
scipy.optimize 改进#
scipy.optimize.basinhopping 全局极小化器获得了一个新关键字 seed,可用于为随机数生成器设置种子并获得可重复的极小化结果。
scipy.optimize.curve_fit 中的关键字 sigma 被重载,现在也接受数据误差的协方差矩阵。
scipy.signal 改进#
函数 scipy.signal.correlate 和 scipy.signal.convolve 增加了一个新的可选参数 method。默认值 auto 会估算直接法和傅里叶变换法这两种计算方法中较快的一种。
新增了一个用于选择卷积/相关方法的函数 scipy.signal.choose_conv_method,如果对许多相同大小的数组进行卷积或相关操作,该函数可能会很有用。
新增了用于计算输入信号的复数短时傅里叶变换(STFT)以及反变换以恢复原始信号的函数:scipy.signal.stft 和 scipy.signal.istft。此实现还修复了先前在请求复数输出数据时 scipy.signal.spectrogram 输出不正确的问题。
新增了 scipy.signal.sosfreqz 函数,用于计算二阶环节(second-order sections)的频率响应。
新增了 scipy.signal.unit_impulse 函数,以便于生成脉冲函数。
新增了 scipy.signal.iirnotch 函数,用于设计二阶 IIR 陷波滤波器,以从信号中去除特定频率成分。新增了其对偶函数 scipy.signal.iirpeak,用于计算二阶 IIR 峰值(共振)滤波器的系数。
新增了 scipy.signal.minimum_phase 函数,用于将线性相位 FIR 滤波器转换为最小相位。
当 n > 1 且对某些 n 维数组进行操作时,函数 scipy.signal.upfirdn 和 scipy.signal.resample_poly 的运行速度现在明显加快。在沿待滤波轴的数组大小较小(约小于 1k 个样本)的情况下,计算时间的减少最为显著。
scipy.fftpack 改进#
快速傅里叶变换例程现在接受 np.float16 输入,并将其向上转换为 np.float32。此前,它们会引发错误。
scipy.cluster 改进#
scipy.cluster.hierarchy.linkage 的 "centroid" 和 "median" 方法已显著加快。先前在超大输入数据(超过 16 GB)上使用 linkage 的长期遗留问题已得到解决。
scipy.sparse 改进#
新增了 scipy.sparse.save_npz 和 scipy.sparse.load_npz 函数,为某些稀疏格式提供了简单的序列化方法。
更新了 bsr_matrix、csc_matrix 和 csr_matrix 类的 prune 方法,在某些条件下重新分配支持数组,从而减少内存使用。
为 coo_matrix、csc_matrix、csr_matrix 和 bsr_matrix 类新增了 argmin 和 argmax 方法。
新函数 scipy.sparse.csgraph.structural_rank 用于计算具有给定稀疏模式的图的结构秩。
新函数 scipy.sparse.linalg.spsolve_triangular 用于求解左侧矩阵为三角矩阵的稀疏线性方程组。
scipy.special 改进#
来自 scipy.special 的标量、类型化版本的通用函数可以通过 cimport 从新模块 scipy.special.cython_special 引入 Cython 空间。对于标量参数,这些标量函数的运行速度预期将显著快于通用函数。详见 scipy.special 教程。
函数 scipy.special.geterr、scipy.special.seterr 以及上下文管理器 scipy.special.errstate 提供了对特殊函数错误的更好控制。
正交多项式根函数的名称已更改,以与正交多项式的其他相关函数保持一致。例如,scipy.special.j_roots 已重命名为 scipy.special.roots_jacobi,以与相关函数 scipy.special.jacobi 和 scipy.special.eval_jacobi 保持一致。为保持向后兼容性,旧名称仍保留为别名。
赖特欧米伽(Wright Omega)函数已实现为 scipy.special.wrightomega。
scipy.stats 改进#
新增了 scipy.stats.weightedtau 函数。它提供了肯德尔等级相关系数(Kendall's tau)的加权版本。
新类 scipy.stats.multinomial 实现了多项分布。
新类 scipy.stats.rv_histogram 从分箱数据样本中构建具有分段线性累积分布函数(CDF)的连续单变量分布。
新类 scipy.stats.argus 实现了阿古斯(Argus)分布。
scipy.interpolate 改进#
新类 scipy.interpolate.BSpline 表示样条曲线。BSpline 对象包含节点和系数,并且可以对样条进行求值。该格式与 FITPACK 一致,因此例如可以执行
>>> t, c, k = splrep(x, y, s=0)
>>> spl = BSpline(t, c, k)
>>> np.allclose(spl(x), y)
spl* 函数(scipy.interpolate.splev、scipy.interpolate.splint、scipy.interpolate.splder 和 scipy.interpolate.splantider)同时接受 BSpline 对象和 (t, c, k) 元组,以实现向后兼容。
对于多维样条(c.ndim > 1),BSpline 对象与分段多项式 scipy.interpolate.PPoly 保持一致。这意味着 BSpline 对象并不直接与 scipy.interpolate.splprep 一致,且您无法执行 >>> BSpline(*splprep([x, y])[0])。请查阅 scipy.interpolate 测试套件以获取精确等效的示例。
在新代码中,推荐使用 scipy.interpolate.BSpline 对象,而不是直接操作 (t, c, k) 元组。
新函数 scipy.interpolate.make_interp_spline 用于根据数据点和边界条件构建插值样条。
新函数 scipy.interpolate.make_lsq_spline 用于根据数据点构建最小二乘样条逼近。
scipy.integrate 改进#
现在 scipy.integrate.fixed_quad 支持向量值函数。
已弃用的功能#
scipy.interpolate.splmake、scipy.interpolate.spleval 和 scipy.interpolate.spline 已被弃用。splmake/spleval 使用的格式与 splrep/splev 不一致,这给用户带来了困惑。
scipy.special.errprint 已被弃用。改进后的功能可在 scipy.special.seterr 中使用。
调用 scipy.spatial.distance.pdist 或 scipy.spatial.distance.cdist 并传入所选度量不需要的参数已被弃用。此外,度量 “old_cosine” 和 “old_cos” 也已被弃用。
向后不兼容的变更#
已移除被弃用的 scipy.weave 子模块。
scipy.spatial.distance.squareform 现在返回与输入具有相同 dtype 的数组,而不是始终返回 float64。
scipy.special.errprint 现在返回布尔值。
函数 scipy.signal.find_peaks_cwt 现在返回数组,而不是列表。
scipy.stats.kendalltau 现在可以在输入包含结(ties,相同值)时计算正确的 p 值。该 p 值也与 scipy.stats.mstats.kendalltau 以及 R 所计算的相同。如果输入不包含结,则与之前的实现相比没有变化。
函数 scipy.linalg.block_diag 将不再忽略大小为零的矩阵。相反,它将插入相应大小的零行或零列。详见 gh-4908。
其他变更#
SciPy 轮子(wheels)现在将在所有平台上报告其对 numpy 的依赖。做出这一更改是因为 Numpy 的轮子现已可用,并且 pip 的升级行为终于向好的方向转变(对于 pip >= 8.2,使用 --upgrade-strategy=only-if-needed;该行为将在下一个 pip 主版本中成为默认行为)。
与先前的 scipy 版本相比,使用 kind="cubic" 和 "quadratic" 的 scipy.interpolate.interp1d 返回的数值可能会发生变化。如果您的代码依赖于特定的数值(即,依赖于插值器的实现细节),您可能需要重新核对您的结果。