详细的SciPy路线图

这份路线图的大部分内容旨在提供一个高级视图,说明每个本网站的子模块在新功能、错误修复等方面最需要什么。除了“一切照常”的重要变化外,它还包含主要新功能的想法-这些功能都是这样标记的,预计需要付出大量的努力。本路线图中没有提到的事情不一定不重要或超出范围,但是我们(本网站的开发者)希望为我们的用户和贡献者提供一个清晰的图景,让他们了解本网站的发展方向和最需要帮助的地方。

注解

这是详细的路线图。仅包含最重要思想的非常高层次的概述是 SciPy路线图

一般信息

这一路线图将与本科学计划一起发展。更新可以作为拉取请求提交。对于大型或破坏性的更改,您可能希望首先在scipy-dev邮件列表中讨论这些更改。

API更改

通常,我们希望改进API以尽可能多地去除已知的疣, 但是,在不破坏向后兼容性的情况下尽可能多地

此外,应该(甚至)更清楚地说明在本网站上什么是公开的,什么是私人的。所有私密内容的命名应尽可能以下划线开头。

测试覆盖范围

过去几年添加的代码的测试覆盖率相当好,我们的目标是对所有添加的新代码进行高覆盖率。然而,仍然有大量旧代码的覆盖率很差。将其提高到目前的标准可能并不现实,但我们应该堵塞最大的漏洞。

除了覆盖率之外,还有正确性的问题--较旧的代码可能有几个测试可以提供像样的语句覆盖率,但这并不一定说明代码是否做了它在框上所说的事情。因此,对代码的某些部分进行代码审查 (statssignalndimage 尤其是)是必要的。

文档

主网站scipy.org需要重写。中讨论过的 mail list ,SciPy堆栈已经不再相关了,这个网站应该只效仿numpy.org的例子来制作关于SciPy的网站。有很多新内容要写

否则,文档就完好无损了。扩展当前的文档字符串并将其放入标准的numpy格式应该会继续下去,这样HTML文档中睡觉错误和毛刺的数量就会减少。大多数模块在参考指南中也有一个教程,这是一个很好的介绍,但是也有一些缺失或不完整的教程-这应该得到修复。

基准

这个 asv 以此为基础的基准体系是合理的。添加新基准相当容易,但是运行基准并不是很直观。让这件事变得更容易是当务之急。此外,我们应该在我们的CI中运行它们(GH-8779是对此的持续尝试)。

Cython的使用

关于Cython代码:

  • 目前还不清楚有多少功能可以在不使.so文件太大的情况下被Cythonized。这需要量一量。

  • 应该删除Cython使用NumPy数组的旧语法,代之以Cython内存视图。

Windows构建问题

SciPy严重依赖Fortran代码。这在Windows上仍然是有问题的。目前只有两种选择:使用英特尔Fortran或使用MSVC+gfortran。前者很昂贵,而后者可以工作(这是我们在发布时使用的),但很难正确使用。对于允许贡献者和最终用户在Windows上可靠地构建SciPy而言,使用Flang编译器看起来是长期前进的最佳方式。

持续集成

持续集成状态良好,它目前涵盖了Windows、MacOS和Linux、ARM64和ppc64le平台,以及我们的一系列依赖版本和构建版本质量轮。

二进制文件的大小

SciPy二进制文件非常大(例如,1.4.1的解压的manylinux轮是91MB),这可能会有问题-例如,在AWS Lambda中使用,它有250 MB的大小限制。我们的目标是保持尽可能小的二进制大小;当添加新的编译扩展时,需要检查这一点。在中剥离调试符号 multibuild can likely be improved (see this issue )。

模块

集群

这个模块状态良好。

常量

此模块已基本完成,维护成本较低,没有未解决的问题。

FFT

这个模块状态良好。

集成

ODE解算器需要:

  • 文档相当糟糕,需要修复

  • 一种新的ODE求解器接口 (solve_ivp )添加到本网站1.0.0中。将来我们可以考虑(软)弃用旧的API。

数值积分函数形状良好。支持集成复值函数和集成多个区间(请参见 gh-3325 )可以添加。

插补

关于新功能的想法:

  • 具有更好的用户控制的样条曲线拟合例程。

  • 透明张量积样条。

  • NURBS支持。

  • B样条和相应张量积的网格细化和粗化。

IO

波形文件:

  • 将支持PCM浮点,用于任何其他用途 audiolab 或其他专业类库。

  • 如果数据无法理解,则引发错误而不是警告。

其他子模块(MATLAB、netcdf、IDL、Harwell-Boeing、ARFF、Matrix Market)状况良好。

线性

scipy.linalg 状态很好。

需要:

  • 通过以下功能减少功能重复 numpy.linalg ,保证接口一致性。

  • get_lapack_funcs should always use flapack

  • 包装更多LAPACK函数

  • LU分解的函数太多,请删除一个

关于新功能的想法:

  • 在Cython BLAS和LAPACK中添加类型泛型包装器

  • 把许多线性代数例程变成Gufunction

BLAS和LAPACK

中的Python和Cython接口到BLAS和LAPACK scipy.linalg 是本网站提供的最重要的东西之一。总体而言 scipy.linalg 状态良好,但是我们可以做一些改进:

  1. 库支持。我们发布的车轮现在附带OpenBLAS,这是目前唯一可行的Performant选项(ATLAS太慢,MKL由于许可问题不能成为默认选项,Accelerate支持被放弃,因为Apple不再更新Accelerate)。但是OpenBLAS并不是很稳定,有时它的发布会破坏一些东西,并且它在线程方面有问题(目前在PyPy3中使用SciPy的唯一问题)。我们至少需要对调试OpenBLAS问题提供更好的支持,并且需要更好的文档来说明如何使用它构建SciPy。一个选项是将BLIS用于BLAS接口(请参见 numpy gh-7372 )。

  2. 支持较新的LAPACK功能。在SciPy 1.2.0中,我们将LAPACK的最低支持版本提高到了3.4.0。现在我们删除了Python2.7,我们可以进一步增加该版本(MKL+Python2.7之前是3.4.0以上的拦截器),并开始在LAPACK中添加对新特性的支持。

杂项

scipy.misc 将作为公共模块移除。其中的大多数函数已移至另一个子模块或已弃用。剩下的为数不多的几个人:

  • infowho :这些是NumPy函数

  • derivativecentral_diff_weight :删除,可能替换为更广泛的数值微分功能。

图像

潜在的 ndimage 是一个强大的插值引擎。用户期望使用以下两种模型中的一种:像素模型 (1, 1) 具有中心的元素 (0.5, 0.5) ,或数据点模型,其中值在栅格上的点处定义。随着时间的推移,我们确信数据点模型定义得更好,实现起来也更容易,但这一点应该在文档中清楚地传达出来。

不过,更重要的是,本网站实现了一个 变体 在此数据点模型中,轴的任意两个两端的数据点共享 周期性包裹 模式。例如,在一维阵列中,您将拥有 x[0] and x[-1] co-located. A very common use-case, however, is for signals to be periodic, with equal spacing between the first and last element along an axis (instead of zero spacing). Wrapping modes for this use-case were added in gh-8537 接下来,应更新内插例程以使用这些模式。这将解决若干问题,包括gh-1323、gh-1903、gh-2045和gh-2640。

形态界面需要标准化:

  • 二进制膨胀/侵蚀/打开/关闭采用“结构”参数,而它们的灰色等效参数采用大小(必须是元组,而不是标量)、足迹或结构。

  • 标量的大小应该是可接受的,相当于为每个轴提供相同的值。

  • 对于二元膨胀/侵蚀/打开/关闭,结构元素是可选的,而对于灰色是必需的。灰度形态学操作应该得到相同的默认值。

  • 在可能的情况下,其他筛选器也应该采用该缺省值。

网上解决方案

这个模块状态合理,尽管它可能需要更多的维护。这里没有重大计划或愿望。

优化

总体而言,这个模块状态良好。在1.2.0中添加了两个优秀的全局优化器;大规模优化器仍然是一个可以填补的空白。其他需要的东西:

  • 中有关附加功能(例如整数约束、稀疏矩阵支持、性能改进)的许多想法 linprog, see gh-9269

  • 向基准测试套件添加功能,以便更轻松地比较结果(例如,使用汇总图)。

  • 不推荐使用 fmin_* 文档中的函数, minimize 是首选的。

  • scipy.optimize 在全局优化器的准确性和速度方面有一套广泛的基准。这允许添加新的优化器 (shgodual_annealing ),性能比现有的要好得多。这个 optimize 然而,Benchmark系统本身很慢,很难使用;我们需要让它更快,更容易通过绘制性能曲线来比较优化器的性能。

信号

卷积和相关 :(相关函数为卷积、关联、fft卷积、卷积2d、关联2d和Sepfir2d。)消除与 ndimage (和其他地方)。从… numpyscipy.signalscipy.ndimage (我们在其他任何地方都可以找到它们),为一维、二维和n-D卷积和相关挑选“最佳的”,将实现放在某个地方,并在整个SciPy中一致使用。

B-splines :(相关函数为B样条、三次、二次、高斯_SPLINE、cSpline1d、qSpline1d、cSpline2d、qSpline2d、cSpline1d_eval和SPLINE_过滤。)把好东西搬到 interpolate (通过适当的API更改以匹配中的操作方式 interpolate ),并消除任何重复。

过滤设计 :合并 firwinfirwin2 所以 firwin2 可以移除。

Continuous-Time Linear Systems :删除 lsim2impulse2step2 。这个 lsimimpulsestep 函数现在对任何输入系统都“正常工作”。进一步提高了系统的性能 ltisys (不同表示之间的内部转换更少)。填补LTI系统转换功能的空白。

二级截面 :使SOS过滤与现有方法具有同等能力。这包括ltisys对象、 lfiltic 与其他过滤表示形式之间的等效且数值稳定的转换。由于其数值稳定性,SOS滤波器可以被认为是Ltisys对象的默认过滤方法。

小波分析 :现在的情况没有多大意义。目前仅限连续小波-决定是否完全重写或删除它们。离散小波变换超出了范围(PyWavelets在这方面做得很好)。

稀疏

稀疏矩阵格式大多是功能完整的,但是主要问题是它们的行为类似于 numpy.matrix (它将在NumPy中的某个时候被弃用)。我们想要的是稀疏数组,其行为类似于 numpy.ndarray 。这一点在https://github.com/pydata/sparse,中正在进行中,它已经进行了相当长的一段时间。初步计划是:

  • 开始依赖于 pydata/sparse 一旦它的特性足够完整(它仍然需要CSC/CSR等效项)并且在性能方面还可以。

  • 添加对以下各项的支持 pydata/sparsescipy.sparse.linalg (也许还可以 scipy.sparse.csgraph 在那之后)。

  • 在文档中指出,对于新代码,用户应该首选 pydata/sparse 在稀疏矩阵上。

  • 当NumPy不推荐使用时 numpy.matrix 、供应商或将其作为独立软件包进行维护。

关于不同的稀疏矩阵格式:有很多种。这些应该保留,但改进/优化应该进入CSR/CSC,这是首选的格式。LIL可能是个例外,它的效率本来就很低。如果将DOK扩展为支持LIL当前提供的所有操作,则可能会删除它。

sparse.csgraph

这个模块状态良好。

sparse.linalg

阿尔帕克的状态很好。

iSolve:

  • 回调关键字不一致

  • TOL关键字已损坏,应相对于

  • Fortran代码不能重入(但我们不解决问题,可能会重用PyKrilov中的代码)

解算:

  • 添加稀疏Cholesky或不完整Cholesky

  • 添加稀疏QR

  • 改进SuiteSparse UMFPACK接口

  • 向SuiteSparse CHOLMOD和SPQR添加接口

关于新功能的想法:

  • 用于Propack的包装器,用于更快的稀疏SVD计算。

空间

QHull包装完好无损,就像现在一样 cKDTree

需要:

  • KDTree 将被移除,并且 cKDTree 将重命名为 KDTree 以向后兼容的方式。

  • distance_wrap.c 需要清理(可能用Cython重写)。

特价

虽然仍有许多函数在精度上需要改进,但最引人注目的可能只有超几何函数、抛物线柱面函数和球面波函数。有三种可能的方法来处理此问题:

  1. 获得良好的双精度实现。这对于抛物线柱面功能(正在进行)是可行的。我认为超几何函数是可能的,尽管可能不会及时实现。对于球面波函数,这在目前的理论中是不可能的。

  2. Port Boost的任意精确库,并在引擎盖下使用它来获得双精度精度。作为超几何函数的权宜之计,这可能是必要的;@nmayorov和in gh-5349 。这可能是球面波函数所必需的,可以重复使用:https://github.com/radelman/scattering.

  3. 在文档中添加有关现有实现限制的明确警告。

统计数据

这个 scipy.stats 子软件包旨在提供标准统计文本中可能包含的基本统计方法,如约翰逊的“Miller&Freund‘s Probability and Statistics for Engineers”、Sokal&Rohlf的“Biometry”或Zar的“BioStatistics Analysis”。它不寻求复制下游包(例如,StatsModel、LinearModel、PyMC3)的高级功能;相反,它可以为它们的构建提供坚实的基础。(请注意,这些是粗略的指导方针,不是严格的规则。“高级”是一个定义不明确的主观术语,“高级”方法也可能包括在本科学计划中,特别是如果没有其他广泛使用和得到很好支持的一揽子计划涵盖该主题的话。另请注意, some 与下游项目重复是不可避免的,不一定是坏事。)

以下改进将帮助本网站更好地发挥这一作用。

  • 添加基本且广泛使用的假设检验:

    • 图基-克雷默试验

    • 邓内特试验

    • 各种类型的方差分析(ANOVA):

      • 双向方差分析(单重复、均匀重复数、可变重复数)

      • 多因素方差分析(即推广的双向方差分析)

      • 嵌套方差分析

      • 协方差分析(ANCOVA)

  • 添加用于元分析的其他工具;目前我们仅有 combine_pvalues

  • 增强 fit 连续概率分布法:

    • 扩展管件选项以包括:

      • 最大乘积间距

      • L-矩/概率加权矩方法

    • 在结果中包括拟合优度的度量

    • 处理被审查的数据(例如合并 gh-13699 )

  • 实施其他广泛使用的连续和离散概率分布:

    • 多元t分布

    • 混合分布

  • 改进由SciPy的概率分布提供的核心计算,以便它们能够稳健地处理大范围的参数值。具体地说,使用Boost实现替换scipy.Special中使用的Fortran库CDFLIB中的许多PDF和CDF方法,如 gh-13328

此外,我们应该:

  • 继续制作函数签名的工作 statsstats.mstats 更加一致,并添加测试以确保情况保持不变。

  • 改进统计测试:始终如一地为适用的单边和双侧替代假设提供选项,返回测试统计的置信区间,并在计算可行的情况下实现精确的p值计算(考虑平局的可能性)。