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。用于
scipy.special模块中通用函数的标量、类型化版本的 Cython API,通过 cimport scipy.special.cython_special。
新功能#
外部函数接口改进#
scipy.LowLevelCallable 提供了一个新的统一接口,用于在 Python 空间中包装低级编译的回调函数。它支持 Cython 导入的“API”函数、ctypes 函数指针、CFFI 函数指针、PyCapsules、Numba 编译的函数等。有关详细信息,请参阅 gh-6509。
scipy.linalg 改进#
函数 scipy.linalg.solve 增加了两个关键字 assume_a 和 transposed。底层的 LAPACK 例程被替换为“expert”版本,现在还可以用于求解对称、厄米和正定系数矩阵。此外,病态矩阵现在会发出警告,并提供估计的条件数信息。为了保持向后兼容性,旧的 sym_pos 关键字被保留,但它与使用 assume_a='pos' 相同。此外,已弃用 debug 关键字,它没有任何功能,只是打印 overwrite_<a, b> 的值。
添加了函数 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 可以处理超过 200k 个点(至少 1000 万个),并且性能有所提高。
添加了函数 scipy.spatial.distance.directed_hausdorff 来计算有向 Hausdorff 距离。
scipy.spatial.cKDTree 的 count_neighbors 方法通过新的关键字 weights 和 cumulative 获得了执行加权对计数的能力。有关详细信息,请参阅 gh-5647。
scipy.spatial.distance.pdist 和 scipy.spatial.distance.cdist 现在支持非双精度自定义度量。
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 来选择卷积/相关方法,如果对相同大小的许多数组执行卷积或相关,则此函数可能很合适。
添加了新的函数来计算输入信号的复数短时傅里叶变换,并反变换以恢复原始信号:scipy.signal.stft 和 scipy.signal.istft。此实现还修复了先前 scipy.signal.spectrogram 在请求复数输出数据时存在的错误输出。
添加了函数 scipy.signal.sosfreqz 以从二阶段计算频率响应。
添加了函数 scipy.signal.unit_impulse 以方便地生成冲激函数。
添加了函数 scipy.signal.iirnotch 以设计二阶 IIR 陷波滤波器,可用于从信号中去除频率分量。添加了双函数 scipy.signal.iirpeak 来计算二阶 IIR 峰值(谐振)滤波器的系数。
添加了函数 scipy.signal.minimum_phase 以将线性相位 FIR 滤波器转换为最小相位。
函数 scipy.signal.upfirdn 和 scipy.signal.resample_poly 在处理某些 n 维数组(n > 1)时速度显著提高。计算时间的减少量最大的是在沿着要滤波的轴的数组大小较小(约小于 1k 个样本)的情况下。
scipy.fftpack 改进#
快速傅里叶变换例程现在接受 np.float16 输入并将其向上转换为 np.float32。以前,它们会引发错误。
scipy.cluster 改进#
scipy.cluster.hierarchy.linkage 的 "centroid" 和 "median" 方法已显著加速。使用 linkage 处理大型输入数据(超过 16 GB)的长期存在的问题已得到解决。
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 现在返回一个数组而不是列表。
当输入包含 tie 时,scipy.stats.kendalltau 现在计算正确的 p 值。 p 值也与 scipy.stats.mstats.kendalltau 和 R 计算的 p 值相同。如果输入不包含 tie,则与之前的实现没有变化。
函数 scipy.linalg.block_diag 将不再忽略零大小的矩阵。相反,它将插入适当大小的零行或零列。有关更多详细信息,请参阅 gh-4908。
其他变更#
SciPy wheel 现在将在所有平台上报告其对 numpy 的依赖。此更改的目的是因为 Numpy wheel 可用,并且因为 pip 的升级行为最终得到了改善(对于 pip >= 8.2 使用 --upgrade-strategy=only-if-needed;这种行为将在 pip 的下一个主要版本中成为默认设置)。
使用 kind="cubic" 和 "quadratic" 的 scipy.interpolate.interp1d 返回的数值可能与之前的 scipy 版本相比有所不同。如果您的代码依赖于特定的数值(即插值器的实现细节),您可能需要仔细检查您的结果。