SciPy-1-12-中文文档-二十八-

SciPy 1.12 中文文档(二十八)

原文:docs.scipy.org/doc/scipy-1.12.0/index.html

scipy.stats.ppcc_max

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.ppcc_max.html#scipy.stats.ppcc_max

scipy.stats.ppcc_max(x, brack=(0.0, 1.0), dist='tukeylambda')

计算最大化 PPCC 的形状参数。

概率图相关系数(PPCC)图可用于确定单参数分布族的最佳形状参数。ppcc_max 返回使得给定数据到单参数分布族的概率图相关系数最大化的形状参数。

参数:

x 类似数组

输入数组。

brack 元组,可选

三元组(a,b,c),其中(a<b<c)。如果 bracket 包含两个数(a,c),则它们被假定为向下搜索的起始区间(参见 scipy.optimize.brent)。

dist 字符串或 stats.distributions 实例,可选

分布或分布函数名称。对象足够像一个 stats.distributions 实例(即它们有一个 ppf 方法)也被接受。默认为 'tukeylambda'

返回:

shape_value 浮点数

使概率图相关系数达到其最大值的形状参数。

另请参阅

ppcc_plot, probplot, boxcox

注意

brack 关键字作为起始点,在极端情况下很有用。可以使用绘图来获取最大值位置的粗略视觉估计,以便在其附近开始搜索。

参考文献

[1]

J.J. Filliben,“用于正态性的概率图相关系数检验”,Technometrics,Vol. 17,pp. 111-117,1975 年。

[2]

工程统计手册,NIST/SEMATEC,www.itl.nist.gov/div898/handbook/eda/section3/ppccplot.htm

示例

首先,我们从形状参数为 2.5 的威布尔分布生成一些随机数据:

>>> import numpy as np
>>> from scipy import stats
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()
>>> c = 2.5
>>> x = stats.weibull_min.rvs(c, scale=4, size=2000, random_state=rng) 

为这些数据生成威布尔分布的 PPCC 图。

>>> fig, ax = plt.subplots(figsize=(8, 6))
>>> res = stats.ppcc_plot(x, c/2, 2*c, dist='weibull_min', plot=ax) 

我们计算形状应达到其最大值的位置,并在那里画一条红线。该线应与 PPCC 图中的最高点重合。

>>> cmax = stats.ppcc_max(x, brack=(c/2, 2*c), dist='weibull_min')
>>> ax.axvline(cmax, color='r')
>>> plt.show() 

../../_images/scipy-stats-ppcc_max-1.png

scipy.stats.ppcc_plot

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.ppcc_plot.html#scipy.stats.ppcc_plot

scipy.stats.ppcc_plot(x, a, b, dist='tukeylambda', plot=None, N=80)

计算并可选地绘制概率图相关系数。

概率图相关系数(PPCC)图可用于确定单参数分布族的最佳形状参数。它不能用于没有形状参数(如正态分布)或具有多个形状参数的分布。

默认情况下使用 Tukey-Lambda 分布(stats.tukeylambda)。Tukey-Lambda PPCC 图通过近似正态分布从长尾到短尾分布进行插值,因此在实践中特别有用。

参数:

x array_like

输入数组。

a, b 标量

使用的形状参数的下限和上限。

dist str 或 stats.distributions 实例,可选

分布或分布函数名称。也接受足够像 stats.distributions 实例的对象(即它们有 ppf 方法)。默认值为 'tukeylambda'

plot 对象,可选

如果给定,则绘制 PPCC 对形状参数的图。plot 是一个具有 “plot” 和 “text” 方法的对象。可以使用 matplotlib.pyplot 模块或 Matplotlib Axes 对象,或具有相同方法的自定义对象。默认值为 None,表示不创建图表。

N int,可选

水平轴上的点数(从 ab 等距分布)。

返回:

svals ndarray

用于计算 ppcc 的形状值。

ppcc ndarray

计算的概率图相关系数值。

参见

ppcc_maxprobplotboxcox_normplottukeylambda

参考文献

J.J. Filliben,《正态性的概率图相关系数检验》,《Technometrics》,第 17 卷,第 111-117 页,1975 年。

示例

首先我们从形状参数为 2.5 的 Weibull 分布生成一些随机数据,并绘制数据的直方图:

>>> import numpy as np
>>> from scipy import stats
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()
>>> c = 2.5
>>> x = stats.weibull_min.rvs(c, scale=4, size=2000, random_state=rng) 

查看数据的直方图。

>>> fig1, ax = plt.subplots(figsize=(9, 4))
>>> ax.hist(x, bins=50)
>>> ax.set_title('Histogram of x')
>>> plt.show() 

../../_images/scipy-stats-ppcc_plot-1_00_00.png

现在我们使用 PPCC 图及相关概率图和 Box-Cox normplot 探索这些数据。在我们预期 PPCC 值最大的形状参数 c 处绘制了一条红线:

>>> fig2 = plt.figure(figsize=(12, 4))
>>> ax1 = fig2.add_subplot(1, 3, 1)
>>> ax2 = fig2.add_subplot(1, 3, 2)
>>> ax3 = fig2.add_subplot(1, 3, 3)
>>> res = stats.probplot(x, plot=ax1)
>>> res = stats.boxcox_normplot(x, -4, 4, plot=ax2)
>>> res = stats.ppcc_plot(x, c/2, 2*c, dist='weibull_min', plot=ax3)
>>> ax3.axvline(c, color='r')
>>> plt.show() 

../../_images/scipy-stats-ppcc_plot-1_01_00.png

scipy.stats.probplot

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.probplot.html#scipy.stats.probplot

scipy.stats.probplot(x, sparams=(), dist='norm', fit=True, plot=None, rvalue=False)

计算概率图的分位数,并可选择显示图。

生成样本数据的概率图,与指定理论分布的分位数(默认情况下为正态分布)进行比较。probplot 可选地计算数据的最佳拟合线,并使用 Matplotlib 或给定的绘图函数绘制结果。

参数:

x 类似数组

probplot 创建图的样本/响应数据。

sparams 元组,可选

特定于分布的形状参数(形状参数加上位置和尺度)。

dist 字符串或 stats.distributions 实例,可选

分布或分布函数名称。默认值为 'norm',用于正态概率图。看起来足够像 stats.distributions 实例的对象(即它们具有 ppf 方法)也被接受。

fit 布尔值,可选

如果为 True(默认值),则对样本数据拟合最小二乘回归(最佳拟合)线。

plot 对象,可选

如果提供,则绘制分位数图。如果给定并且fit 为 True,则还绘制最小二乘拟合。plot 是一个必须具有“plot”和“text”方法的对象。可以使用 matplotlib.pyplot 模块或 Matplotlib Axes 对象,或具有相同方法的自定义对象。默认值为 None,表示不创建任何图。

rvalue 布尔值,可选

如果提供了 plot 并且fit 为 True,则将 rvalue 设置为 True 会在图中包含确定系数。默认值为 False。

返回:

(osm, osr) ndarrays 元组

具有理论分位数元组(osm,或顺序统计中位数)和有序响应(osr)的元组。osr 简单地是排序后的输入 x。有关如何计算 osm 的详细信息,请参阅注释部分。

(slope, intercept, r) 浮点数元组,可选

包含最小二乘拟合结果的元组,如果probplot 执行拟合。r 是确定系数的平方根。如果 fit=Falseplot=None,则不返回此元组。

注释

即使提供了 plotprobplot 不会显示或保存图形;在调用 probplot 后应使用 plt.show()plt.savefig('figname.png')

probplot 生成一个概率图,不应与 Q-Q 图或 P-P 图混淆。Statsmodels 具有更广泛的类似功能,请参见 statsmodels.api.ProbPlot

用于理论分位数(概率图的横轴)的公式是 Filliben 的估计:

quantiles = dist.ppf(val), for

        0.5**(1/n),                  for i = n
  val = (i - 0.3175) / (n + 0.365),  for i = 2, ..., n-1
        1 - 0.5**(1/n),              for i = 1 

其中 i 表示第 i 个排序值,n 是总值的数量。

例子

>>> import numpy as np
>>> from scipy import stats
>>> import matplotlib.pyplot as plt
>>> nsample = 100
>>> rng = np.random.default_rng() 

自由度较小的 t 分布:

>>> ax1 = plt.subplot(221)
>>> x = stats.t.rvs(3, size=nsample, random_state=rng)
>>> res = stats.probplot(x, plot=plt) 

自由度较大的 t 分布:

>>> ax2 = plt.subplot(222)
>>> x = stats.t.rvs(25, size=nsample, random_state=rng)
>>> res = stats.probplot(x, plot=plt) 

两个正态分布的混合,使用广播:

>>> ax3 = plt.subplot(223)
>>> x = stats.norm.rvs(loc=[0,5], scale=[1,1.5],
...                    size=(nsample//2,2), random_state=rng).ravel()
>>> res = stats.probplot(x, plot=plt) 

标准正态分布:

>>> ax4 = plt.subplot(224)
>>> x = stats.norm.rvs(loc=0, scale=1, size=nsample, random_state=rng)
>>> res = stats.probplot(x, plot=plt) 

使用 distsparams 关键字生成一个 loggamma 分布的新图:

>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> x = stats.loggamma.rvs(c=2.5, size=500, random_state=rng)
>>> res = stats.probplot(x, dist=stats.loggamma, sparams=(2.5,), plot=ax)
>>> ax.set_title("Probplot for loggamma dist with shape parameter 2.5") 

用 Matplotlib 显示结果:

>>> plt.show() 

../../_images/scipy-stats-probplot-1_00.png../../_images/scipy-stats-probplot-1_01.png

scipy.stats.boxcox_normplot

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.boxcox_normplot.html#scipy.stats.boxcox_normplot

scipy.stats.boxcox_normplot(x, la, lb, plot=None, N=80)

计算 Box-Cox 正态性图形的参数,可选择显示。

Box-Cox 正态性图形直观显示最佳转换参数,用于 boxcox 以获得接近正态分布的结果。

参数:

xarray_like

输入数组。

la, lbscalar

传递给 boxcoxlmbda 值的下限和上限。如果生成了绘图,这些值也是绘图的水平轴的限制。

plotobject, optional

如果给定,绘制分位数和最小二乘拟合。plot 是一个具有“plot”和“text”方法的对象。可以使用 matplotlib.pyplot 模块或 Matplotlib Axes 对象,或具有相同方法的自定义对象。默认为 None,即不创建绘图。

Nint, optional

水平轴上的点数(从 lalb 等距分布)。

返回:

lmbdasndarray

进行 Box-Cox 变换的 lmbda 值。

ppccndarray

通过将 Box-Cox 变换的输入 x 拟合到正态分布时从 probplot 获取的概率图相关系数。

参见

probplot, boxcox, boxcox_normmax, boxcox_llf, ppcc_max

注意

即使给出 plot,调用 probplot 后,boxcox_normplot 不显示或保存图形;应使用 plt.show()plt.savefig('figname.png')

示例:

>>> from scipy import stats
>>> import matplotlib.pyplot as plt 

生成一些非正态分布的数据,并创建 Box-Cox 图形:

>>> x = stats.loggamma.rvs(5, size=500) + 5
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> prob = stats.boxcox_normplot(x, -20, 20, plot=ax) 

确定并绘制最优 lmbda 以转换 x 并在同一图中绘制:

>>> _, maxlog = stats.boxcox(x)
>>> ax.axvline(maxlog, color='r') 
>>> plt.show() 

../../_images/scipy-stats-boxcox_normplot-1.png

scipy.stats.yeojohnson_normplot

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.yeojohnson_normplot.html#scipy.stats.yeojohnson_normplot

scipy.stats.yeojohnson_normplot(x, la, lb, plot=None, N=80)

计算 Yeo-Johnson 正态性图的参数,并可选择显示它。

Yeo-Johnson 正态性图以图形方式显示最佳变换参数,以便在 yeojohnson 中获得接近正态的分布。

参数:

xarray_like

输入数组。

la, lbscalar

传递给 yeojohnson 用于 Yeo-Johnson 变换的 lmbda 的下限和上限。如果生成了图形,则这也是图的水平轴的限制。

plotobject, optional

如果提供,则绘制分位数和最小二乘拟合。plot 是一个必须具有“plot”和“text”方法的对象。可以使用 matplotlib.pyplot 模块或 Matplotlib Axes 对象,或具有相同方法的自定义对象。默认为 None,表示不创建任何图。

Nint, optional

水平轴上的点数(从 lalb 等距分布)。

返回:

lmbdasndarray

进行 Yeo-Johnson 变换的 lmbda 值。

ppccndarray

概率图相关系数,从 probplot 中获取,用于将 Box-Cox 变换后的输入 x 拟合到正态分布。

参见

probplot, yeojohnson, yeojohnson_normmax, yeojohnson_llf, ppcc_max

注意事项

即使给定 plot,调用 boxcox_normplot 后,图形也不会显示或保存;应在调用 probplot 后使用 plt.show()plt.savefig('figname.png')

版本 1.2.0 中的新功能。

示例

>>> from scipy import stats
>>> import matplotlib.pyplot as plt 

生成一些非正态分布的数据,并创建一个 Yeo-Johnson 图:

>>> x = stats.loggamma.rvs(5, size=500) + 5
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> prob = stats.yeojohnson_normplot(x, -20, 20, plot=ax) 

确定并绘制最佳 lmbda,将 x 转换并在同一图中绘制:

>>> _, maxlog = stats.yeojohnson(x)
>>> ax.axvline(maxlog, color='r') 
>>> plt.show() 

../../_images/scipy-stats-yeojohnson_normplot-1.png

scipy.stats.gaussian_kde

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.gaussian_kde.html#scipy.stats.gaussian_kde

class scipy.stats.gaussian_kde(dataset, bw_method=None, weights=None)

使用高斯核进行核密度估计的表示。

核密度估计是以非参数化方式估计随机变量的概率密度函数(PDF)的一种方法。 gaussian_kde 适用于单变量和多变量数据。 它包括自动带宽确定。 该估计对于单峰分布效果最佳; 双峰或多峰分布往往会过度平滑。

参数:

数据集array_like

用于估计的数据点。 在单变量数据的情况下,这是一个 1-D 数组,否则是一个形状为(# dims,# data)的 2-D 数组。

bw_methodstr,标量或可调用对象,可选

用于计算估计器带宽的方法。 这可以是“scott”,“silverman”,标量常数或可调用对象。 如果是标量,则会直接用作 kde.factor。 如果是可调用对象,则应该只接受一个 gaussian_kde 实例作为参数并返回一个标量。 如果为 None(默认值),则使用“scott”。 有关详细信息,请参阅注释。

权重array_like,可选

数据点的权重。 这必须与数据集具有相同的形状。 如果为 None(默认),则假定样本的权重相等。

注意事项

带宽选择强烈影响从 KDE 得到的估计(远远超过核的实际形状)。 带宽选择可以通过“经验法”,交叉验证, “插件方法”或其他方式来完成; 参见 [3][4] 进行评论。 gaussian_kde 使用经验法,默认为斯科特法则。

斯科特法则 [1],实现为scotts_factor,是:

n**(-1./(d+4)), 

n 为数据点数,d 为维数。 在数据点权重不均匀的情况下,scotts_factor 变为:

neff**(-1./(d+4)), 

neff 为有效数据点数。 Silverman 法则 [2],实现为silverman_factor,是:

(n * (d + 2) / 4.)**(-1. / (d + 4)). 

或在数据点权重不均匀的情况下:

(neff * (d + 2) / 4.)**(-1. / (d + 4)). 

可以在 [1][2] 找到关于这个多维实现的数学描述。

对一组加权样本,有效数据点数量neff的定义为:

neff = sum(weights)² / sum(weights²) 

[5]所详述。

gaussian_kde当前不支持数据位于其表达空间的低维子空间中。对于这样的数据,考虑执行主成分分析/降维,并使用gaussian_kde处理转换后的数据。

参考文献

[1] (1,2,3)

D.W. Scott, “多元密度估计:理论、实践与可视化”, John Wiley & Sons, New York, Chicester, 1992.

[2] (1,2)

B.W. Silverman, “统计学与数据分析中的密度估计”, Vol. 26, 统计学与应用概率论丛书, Chapman and Hall, London, 1986.

[3]

B.A. Turlach, “Kernel Density Estimation 中的带宽选择:一项回顾”, CORE 和 Institut de Statistique, Vol. 19, pp. 1-33, 1993.

[4]

D.M. Bashtannyk 和 R.J. Hyndman, “用于核条件密度估计的带宽选择”, Computational Statistics & Data Analysis, Vol. 36, pp. 279-298, 2001.

[5]

Gray P. G., 1969, Journal of the Royal Statistical Society. Series A (General), 132, 272

示例

生成一些随机的二维数据:

>>> import numpy as np
>>> from scipy import stats
>>> def measure(n):
...     "Measurement model, return two coupled measurements."
...     m1 = np.random.normal(size=n)
...     m2 = np.random.normal(scale=0.5, size=n)
...     return m1+m2, m1-m2 
>>> m1, m2 = measure(2000)
>>> xmin = m1.min()
>>> xmax = m1.max()
>>> ymin = m2.min()
>>> ymax = m2.max() 

对数据执行核密度估计:

>>> X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
>>> positions = np.vstack([X.ravel(), Y.ravel()])
>>> values = np.vstack([m1, m2])
>>> kernel = stats.gaussian_kde(values)
>>> Z = np.reshape(kernel(positions).T, X.shape) 

绘制结果:

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ax.imshow(np.rot90(Z), cmap=plt.cm.gist_earth_r,
...           extent=[xmin, xmax, ymin, ymax])
>>> ax.plot(m1, m2, 'k.', markersize=2)
>>> ax.set_xlim([xmin, xmax])
>>> ax.set_ylim([ymin, ymax])
>>> plt.show() 

../../_images/scipy-stats-gaussian_kde-1.png

属性:

datasetndarray

用于初始化gaussian_kde的数据集。

dint

维度的数量。

nint

数据点的数量。

neffint

有效数据点的数量。

1.2.0 版本中的新功能。

factorfloat

kde.covariance_factor获取的带宽因子。kde.factor的平方乘以数据的协方差矩阵进行 kde 估计。

covariancendarray

dataset的协方差矩阵,按计算得到的带宽(kde.factor)进行缩放。

inv_covndarray

covariance的逆矩阵。

方法

evaluate(points) 对一组点评估估计的概率密度函数。
__call__(points) 对一组点评估估计的概率密度函数。
integrate_gaussian(mean, cov) 通过多变量高斯函数乘以估计的密度并在整个空间上积分。
integrate_box_1d(low, high) 计算 1D 概率密度函数在两个边界之间的积分。
integrate_box(low_bounds, high_bounds[, maxpts]) 计算 pdf 在矩形区间上的积分。
integrate_kde(other) 计算该核密度估计与另一个核密度估计的乘积的积分。
pdf(x) 在提供的点集上评估估计的 pdf。
logpdf(x) 在提供的点集上评估估计的 pdf 的对数。
resample([size, seed]) 从估计的 pdf 中随机抽样数据集。
set_bandwidth([bw_method]) 使用给定方法计算估计器带宽。
covariance_factor() 计算乘以数据协方差矩阵以获得核协方差矩阵的系数 (kde.factor)。

scipy.stats.DegenerateDataWarning

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.DegenerateDataWarning.html#scipy.stats.DegenerateDataWarning

exception scipy.stats.DegenerateDataWarning(msg=None)

在数据退化且结果可能不可靠时发出警告。

with_traceback()

Exception.with_traceback(tb) – 将 self.traceback 设置为 tb 并返回 self。

scipy.stats.ConstantInputWarning

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.ConstantInputWarning.html#scipy.stats.ConstantInputWarning

exception scipy.stats.ConstantInputWarning(msg=None)

当数据中所有值完全相等时发出警告。

with_traceback()

Exception.with_traceback(tb) – set self.traceback to tb and return self.

scipy.stats.NearConstantInputWarning

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.NearConstantInputWarning.html#scipy.stats.NearConstantInputWarning

exception scipy.stats.NearConstantInputWarning(msg=None)

在数据中所有值几乎相等时发出警告。

with_traceback()

Exception.with_traceback(tb) – 设置 self.traceback 为 tb 并返回 self。

scipy.stats.FitError

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.stats.FitError.html#scipy.stats.FitError

exception scipy.stats.FitError(msg=None)

表示拟合分布到数据时的错误条件。

with_traceback()

Exception.with_traceback(tb) – 将 self.traceback 设置为 tb 并返回 self。

从源码构建

原文:docs.scipy.org/doc/scipy-1.12.0/building/index.html

注意

如果你只想安装 SciPy,我们建议使用二进制文件 - 详细信息请参见安装

从源码构建 SciPy 需要先设置系统级依赖项(编译器、BLAS/LAPACK 库等),然后调用构建命令。构建可以用来在本地安装 SciPy、开发 SciPy 本身或构建可重新分发的二进制包。可能希望定制构建方式的各个方面。本指南将涵盖所有这些方面。此外,它还提供了有关 SciPy 构建工作方式的背景信息,并链接到通用 Python 构建和打包文档的最新指南,这些内容是相关的。

系统级别依赖

SciPy 使用编译代码以提升速度,这意味着你需要安装编译器和一些其他系统级别(即非 Python/非 PyPI)的依赖项来在你的系统上构建它。

注意

如果你使用的是 Conda,你可以跳过本节中的步骤 - 除了在 Windows 上安装编译器或在 macOS 上安装 Apple 开发者工具之外。mamba env create -f environment.yml命令将自动安装所有其他依赖项。

如果你想使用系统自带的 Python 和pip,你需要:

  • C、C++和 Fortran 编译器(通常是gccg++gfortran)。

  • Python 头文件(通常是名为python3-devpython3-devel的包)

  • BLAS 和 LAPACK 库。OpenBLAS是 SciPy 的默认选项;其他变体包括ATLASMKL

  • 用于依赖检测的pkg-config

要安装 SciPy 的构建要求,可以执行:

sudo apt install -y gcc g++ gfortran libopenblas-dev liblapack-dev pkg-config python3-pip python3-dev 

或者,你可以执行:

sudo apt build-dep scipy 

此命令安装构建 SciPy 所需的一切,其优势在于包管理器处理新的依赖项或更新所需版本。

要安装 SciPy 的构建要求,可以执行:

sudo dnf install gcc-gfortran python3-devel openblas-devel lapack-devel pkgconfig 

或者,你可以执行:

sudo dnf builddep scipy 

此命令安装构建 SciPy 所需的一切,其优势在于包管理器处理新的依赖项或更新所需版本。

要安装 SciPy 的构建要求,可以执行:

sudo yum install gcc-gfortran python3-devel openblas-devel lapack-devel pkgconfig 

或者,你可以执行:

sudo yum-builddep scipy 

此命令安装构建 SciPy 所需的一切,其优势在于包管理器处理新的依赖项或更新所需版本。

要安装 SciPy 的构建要求,可以执行:

sudo pacman -S gcc-fortran openblas pkgconf 

安装 Apple 开发者工具。一个简单的方法是打开终端窗口,输入以下命令:

xcode-select --install 

然后按照提示进行操作。Apple 开发者工具包括 Git、Clang C/C++编译器和其他可能需要的开发工具。

不要使用 macOS 系统自带的 Python。建议使用python.org 安装程序或 Homebrew、MacPorts 或 Fink 等软件包管理器来安装 Python。

您还需要安装 Fortran 编译器、BLAS 和 LAPACK 库以及 pkg-config 这些其他系统依赖项。建议使用Homebrew来安装这些依赖项:

brew install gfortran openblas pkg-config 

注意

从 SciPy >=1.2.0 开始,我们不支持使用系统自带的 Accelerate 库来编译 BLAS 和 LAPACK。它不支持足够新的 LAPACK 接口。计划在 2023 年进行更改,因为 macOS 13.3 引入了对 Accelerate 的重大升级,解决了所有已知问题。

在 Windows 上构建 SciPy 需要一套兼容的 C、C++和 Fortran 编译器。与其他平台相比,这在 Windows 上要复杂一些,因为 MSVC 不支持 Fortran,而 gfortran 和 MSVC 不能一起使用。您需要选择其中一组编译器:

  1. MinGW-w64 编译器(gccg++gfortran) - 推荐,因为最容易安装,并且是 SciPy 自己 CI 和二进制文件使用的工具

  2. MSVC + Intel Fortran(ifort

  3. Intel 编译器(iccifort

相较于 macOS 和 Linux,在 Windows 上构建 SciPy 稍显复杂,因为需要设置这些编译器。不像在其他平台上可以直接在命令提示符中运行单行命令。

首先安装 Microsoft Visual Studio - 建议使用 2019 社区版或更新版本(参见Visual Studio 下载站点)。即使使用 MinGW-w64 或 Intel 编译器,也需要安装以确保具有 Windows 通用 C 运行时(在使用 Mingw-w64 时不需要 Visual Studio 的其他组件,如果需要可以取消选择以节省磁盘空间)。

有几个 MinGW-w64 二进制发行版。我们推荐使用 RTools 版本,可以通过 Chocolatey(参见这里的 Chocolatey 安装说明)安装:

choco install rtools -y --no-progress --force --version=4.0.0.20220206 

如遇问题,建议使用与SciPy GitHub Actions CI jobs for Windows中使用的确切版本相同。

MSVC 安装程序不会将编译器添加到系统路径中,并且安装位置可能会更改。要查询安装位置,MSVC 附带有一个vswhere.exe命令行实用工具。为了在您使用的 shell 中使 C/C++编译器可用,您需要运行一个适合位数和架构的.bat文件(例如,对于 64 位 Intel CPU,请使用vcvars64.bat)。

欲获得详细指导,请参阅从命令行使用 Microsoft C++工具集

与 MSVC 类似,Intel 编译器设计为与您正在使用的 shell 中的激活脚本 (Intel\oneAPI\setvars.bat) 一起使用。这使得编译器可以在路径中使用。有关详细指导,请参阅 Intel® oneAPI HPC Toolkit for Windows 入门指南

注意

编译器应该在系统路径上(即 PATH 环境变量应包含可以找到编译器可执行文件的目录)才能被找到,MSVC 是个例外,如果 PATH 上没有其他编译器,它会自动找到。您可以使用任何 shell(例如 Powershell,cmd 或 Git Bash)来调用构建。要检查是否符合条件,请在您使用的 shell 中尝试调用 Fortran 编译器(例如 gfortran --versionifort --version)。

警告

在使用 conda 环境时,由于过时的 Fortran 编译器可能会导致环境创建失败。如果发生这种情况,请从 environment.yml 中删除 compilers 条目,然后重试。Fortran 编译器应按照本节描述的方式安装。

从源码构建 SciPy

如果您只想从源码安装 SciPy 一次而不进行任何开发工作,则建议使用 pip 来构建和安装。否则,推荐使用 conda。

注意

如果您尚未安装 conda,我们建议使用 Mambaforge;任何 conda 都可以使用。

从源码构建以使用 SciPy

如果您使用的是 conda 环境,pip 仍然是调用 SciPy 源码构建的工具。重要的是始终使用 --no-build-isolation 标志来执行 pip install 命令,以避免针对 PyPI 上的 numpy 轮构建。为了使其工作,您必须先将其余构建依赖项安装到 conda 环境中:

# Either install all SciPy dev dependencies into a fresh conda environment
mamba env create -f environment.yml

# Or, install only the required build dependencies
mamba install python numpy cython pythran pybind11 compilers openblas meson-python pkg-config

# To build the latest stable release:
pip install scipy --no-build-isolation --no-binary scipy

# To build a development version, you need a local clone of the SciPy git repository:
git clone https://github.com/scipy/scipy.git
cd scipy
git submodule update --init
pip install . --no-build-isolation 
# To build the latest stable release:
pip install scipy --no-binary scipy

# To build a development version, you need a local clone of the SciPy git repository:
git clone https://github.com/scipy/scipy.git
cd scipy
git submodule update --init
pip install . 

用于 SciPy 开发的源码构建

如果您希望从源码构建以便于在 SciPy 自身上工作,请首先克隆 SciPy 存储库:

git clone https://github.com/scipy/scipy.git
cd scipy
git submodule update --init 

然后,您需要执行以下操作:

  1. 创建一个专用的开发环境(虚拟环境或 conda 环境),

  2. 安装所有需要的依赖项(构建,以及 测试文档可选 依赖项),

  3. 使用我们的 dev.py 开发者接口构建 SciPy。

步骤(3)始终相同,步骤(1)和(2)在 conda 和虚拟环境之间有所不同:

要创建一个 scipy-dev 开发环境并安装每个必需和可选的依赖项,请运行:

mamba env create -f environment.yml
mamba activate scipy-dev 

注意

有许多工具可以管理虚拟环境,如 venvvirtualenv/virtualenvwrapperpyenv/pyenv-virtualenv,Poetry,PDM,Hatch 等。这里我们使用 Python 标准库中的基本工具 venv。您可以使用任何其他工具;我们只需要一个已激活的 Python 环境即可。

在名为 venv 的新目录中创建并激活虚拟环境(请注意,激活命令可能因您的操作系统和 Shell 而异,请参阅“venv 工作原理”中的 venv 文档)。

python -m venv venv
source venv/bin/activate 
python -m venv venv
source venv/bin/activate 
python -m venv venv
.\venv\Scripts\activate 

然后使用以下命令从 PyPI 安装 Python 级依赖项(参见 pyproject.toml):

# Build dependencies
python -m pip install numpy cython pythran pybind11 meson-python ninja pydevtool rich-click

# Test and optional runtime dependencies
python -m pip install pytest pytest-xdist pytest-timeout pooch threadpoolctl asv gmpy2 mpmath hypothesis

# Doc build dependencies
python -m pip install sphinx "pydata-sphinx-theme==0.9.0" sphinx-design matplotlib numpydoc jupytext myst-nb

# Dev dependencies (static typing and linting)
python -m pip install mypy typing_extensions types-psutil pycodestyle ruff cython-lint 

要在已激活的开发环境中构建 SciPy,请运行:

python dev.py build 

这将在存储库内安装 SciPy(默认情况下在 build-install 目录中)。然后您可以运行测试(python dev.py test),进入 IPython(python dev.py ipython),或者进行其他开发步骤,如构建 HTML 文档或运行基准测试。dev.py 接口具有自我文档功能,请参阅 python dev.py --helppython dev.py <subcommand> --help 以获取详细指导。

IDE 支持和可编辑安装

虽然 dev.py 接口是我们在 SciPy 上推荐的工作方式,但它有一个限制:由于自定义安装位置的原因,使用 dev.py 安装的 SciPy 将不会在 IDE 中被自动识别(例如,通过“运行”按钮运行脚本或者通过视觉设置断点)。这在 就地构建(或“可编辑安装”)中可以更好地工作。

支持可编辑安装。重要的是要理解 在给定的存储库克隆中,您可以使用可编辑安装或 dev.py,但不能两者都用。如果使用可编辑安装,您必须直接使用 pytest 和其他开发工具,而不是使用 dev.py

若要使用可编辑安装,请确保从干净的存储库开始(如果之前使用过 dev.py,请运行 git clean -xdf),并且如本页面上方描述的那样正确设置所有依赖项。然后执行:

# Note: the --no-build-isolation is important! meson-python will
# auto-rebuild each time SciPy is imported by the Python interpreter.
pip install -e . --no-build-isolation

# To run the tests for, e.g., the `scipy.linalg` module:
pytest scipy/linalg 

对 SciPy 代码进行更改时,包括编译代码,无需手动重新构建或重新安装。当您运行 git clean -xdf 时,它会删除构建的扩展模块,同时记住也要使用 pip uninstall scipy 卸载 SciPy。

请参阅 meson-python 文档中有关可编辑安装更多细节的介绍。

自定义构建

  • 选择编译器和自定义构建

  • BLAS 和 LAPACK

  • 交叉编译

  • 构建可重分发的二进制文件

背景信息

  • 理解 Meson

  • 内省构建步骤

  • Meson 和 distutils 的工作方式

编译器选择和定制构建

原文链接:docs.scipy.org/doc/scipy-1.12.0/building/compilers_and_options.html

选择特定的编译器

Meson 支持标准的环境变量 CC, CXXFC 来选择特定的 C、C++ 和/或 Fortran 编译器。这些环境变量在Meson 文档中的参考表中有详细说明。

请注意,环境变量仅在清理构建时才会被应用,因为它们会影响配置阶段(即 meson setup)。增量重建不会对环境变量的更改做出反应 - 您必须运行 git clean -xdf 并进行完整重建,或者运行 meson setup --reconfigure

添加自定义编译器或链接器标志

Meson 的设计偏向通过传递给 meson setup 的命令行选项配置构建。它提供了许多内置选项:

  • 要启用调试构建和优化级别,请参见下一节关于“构建类型”的内容,

  • 以便以便携带的方式启用 -Werror,可以通过 -Dwerror=true 完成,

  • 启用警告级别的方法是通过 -Dwarning_level=<val> 完成,其中 <val> 可选值为 {0, 1, 2, 3, everything}

  • 还有许多其他内置选项,例如激活 Visual Studio (-Dvsenv=true) 和使用链接时优化 (-Db_lto),或者更改默认的 C++ 语言级别 (-Dcpp_std='c++17') 或链接器标志 (-Dcpp_link_args='-Wl,-z,defs')。

要了解更多选项,请参阅Meson 内置选项文档页面

Meson 还支持标准的环境变量 CFLAGS, CXXFLAGS, FFLAGSLDFLAGS 以注入额外的标志 - 与前一节中相同的警告一样,这些环境变量仅在清理构建时才会被接受,而不是增量构建。

使用 Meson 进行不同的构建类型

Meson 在配置项目时提供了不同的构建类型。您可以在Meson 文档的“核心选项”部分中查看可用的构建类型选项。

假设您是从头开始构建的(如果需要,请执行 git clean -xdf),您可以按以下步骤配置构建以使用 debug 构建类型:

meson setup build --buildtype debug  --prefix=$PWD/build-install 

现在,您可以使用 dev.py 接口进一步构建、安装和测试 SciPy:

python dev.py -s linalg 

这将有效,因为在初始配置之后,Meson 将记住配置选项。

控制构建并行性

默认情况下,ninja 将启动 2*n_cpu + 2 个并行构建作业,其中 n_cpu 是物理 CPU 核心数。在绝大多数情况下,这是可以接受的,并且可以获得接近最优的构建时间。但在某些情况下,当机器的 RAM 相对于 CPU 核心数较少时,可能会导致作业内存不足。如果发生这种情况,请降低作业数 N,以确保每个作业至少有 2 GB RAM。例如,启动 6 个作业:

python -m pip install . -Ccompile-args="-j6" 

或:

python dev.py build -j6 

并行使用 GCC 和 Clang 进行构建

在同一个仓库中拥有几个不同的 SciPy 构建可能非常有用,例如用于比较两个编译器之间的差异以诊断问题。如前所述,Meson 完全是非就地构建,因此不同的构建不会互相干扰。在本节的其余部分中,我们假设 GCC 是默认的。例如,让我们使用 GCC 和 Clang 进行构建。

  1. 使用 GCC 进行构建:

    python dev.py build 
    

使用上述命令,Meson 将使用(默认的)GCC 编译器在 build 目录中进行构建,并安装到 build-install 目录中。

  1. 使用 Clang 进行构建:

    CC=clang CXX=clang++ FC=gfortran python dev.py --build-dir=build-clang build 
    

使用上述命令,Meson 将使用 Clang、Clang++ 和 Gfortran 编译器在 build-clang 目录中进行构建,并将 SciPy 安装到 build-clang-install 中。

Meson 将记住 build-clang 目录下的编译器选择,并且无法更改,因此每次未来调用 python dev.py --build-dir=build-clang <command> 时将自动使用 Clang。

提示:使用别名可以使这个过程更加简便,例如 alias dev-clang="python dev.py --build-dir=build-clang",然后执行 dev-clang build

拥有两个构建的常见原因是进行比较。例如,要在两个编译器的构建中运行 scipy.linalg 测试,请执行:

python dev.py -s linalg                          # run tests for the GCC build
python dev.py --build-dir build-clang -s linalg  # run tests for the Clang build 

BLAS 和 LAPACK

原文链接:docs.scipy.org/doc/scipy-1.12.0/building/blas_lapack.html

选择 BLAS 和 LAPACK 库

除了默认的 OpenBLAS,通过 Meson 构建选项 实现 BLAS 和 LAPACK 库的选择。例如,要选择普通的 libblasliblapack(这通常是 Linux 发行版上的 Netlib BLAS/LAPACK,并且可以在 conda-forge 上动态切换实现),请使用:

$ # for a development build
$ python dev.py build -C-Dblas=blas -C-Dlapack=lapack

$ # to build and install a wheel
$ python -m build -Csetup-args=-Dblas=blas -Csetup-args=-Dlapack=lapack
$ pip install dist/scipy*.whl

$ # Or, with pip>=23.1, this works too:
$ python -m pip -Csetup-args=-Dblas=blas -Csetup-args=-Dlapack=lapack 

其他应该可以工作的选项(只要安装了 pkg-config 或 CMake 支持),包括 mklatlasblis

使用 pkg-config 在非标准位置检测库

BLAS 和 LAPACK 检测的内部工作原理是 Meson 首先尝试使用 pkg-config 发现指定的库,然后使用 CMake。如果你只有一个独立的共享库文件(例如,在 /a/random/path/lib/ 中的 armpl_lp64.so 和对应的头文件在 /a/random/path/include/ 中),那么你需要自己编写一个 pkg-config 文件。它应该具有相同的名称(所以在这个例子中是 armpl_lp64.pc),可以放置在任何位置。PKG_CONFIG_PATH 环境变量应设置为指向 .pc 文件的位置。该文件的内容应为:

libdir=/path/to/library-dir      # e.g., /a/random/path/lib
includedir=/path/to/include-dir  # e.g., /a/random/path/include
version=1.2.3                    # set to actual version
extralib=-lm -lpthread -lgfortran   # if needed, the flags to link in dependencies
Name: armpl_lp64
Description: ArmPL - Arm Performance Libraries
Version: ${version}
Libs: -L${libdir} -larmpl_lp64      # linker flags
Libs.private: ${extralib}
Cflags: -I${includedir} 

要检查这是否按预期工作,您应该能够运行:

$ pkg-config --libs armpl_lp64
-L/path/to/library-dir -larmpl_lp64
$ pkg-config --cflags armpl_lp64
-I/path/to/include-dir 

指定要使用的 Fortran ABI

一些线性代数库使用 g77 ABI(也称为“f2c 调用约定”),其他使用 GFortran ABI,这两种 ABI 不兼容。因此,如果您使用 gfortran 构建 SciPy 并链接到像 MKL 这样使用 g77 ABI 构建的线性代数库,将会出现异常或段错误。SciPy 通过使用 ABI 包装器解决了这个问题,ABI 包装器依赖于 CBLAS API 来处理 BLAS API 中少数函数存在的问题。

请注意,SciPy 在构建时需要知道需要执行的操作,构建系统将自动检查线性代数库是否为 MKL 或 Accelerate(这两者始终使用 g77 ABI),如果是,则使用 CBLAS API 而不是 BLAS API。如果自动检测失败或用户希望覆盖此自动检测机制以构建针对普通的 libblas/liblapack(例如 conda-forge 所做的就是这样),请使用 -Duse-g77-abi=true 构建选项。例如:

$ python -m build -C-Duse-g77-abi=true -Csetup-args=-Dblas=blas -Csetup-args=-Dlapack=lapack 

工作进行中

计划完全支持这些选项,但目前不能直接使用:

  • ILP64(64 位整数大小)构建:SciPy 的大部分支持使用 ILP64 BLAS/LAPACK。请注意,支持仍然不完整,因此 SciPy 需要 LP64(32 位整数大小)BLAS/LAPACK。

  • 自动从多个可能的 BLAS 和 LAPACK 选项中选择,并按用户指定的优先顺序进行选择

跨编译

原文链接:docs.scipy.org/doc/scipy-1.12.0/building/cross_compilation.html

跨编译是一个复杂的主题,我们目前只添加了一些希望有帮助的提示。截至 2023 年 5 月,基于crossenv的跨编译已知可以工作,例如在 conda-forge 中使用。没有crossenv的跨编译需要一些手动覆盖。您可以通过向meson-python传递选项来指示这些覆盖项到meson setup中。

所有已知成功进行 SciPy 跨编译的发行版都在使用python -m buildpypa/build),但使用pip也应该是可能的。以下是这些发行版上 SciPy“构建配方”的链接:

另请参阅Meson 关于跨编译的文档以了解您可能需要向 Meson 传递哪些选项才能成功进行跨编译。

一个常见问题是,numpypythran需要运行 Python 代码以获取它们的包含目录。这往往效果不佳,可能会意外地从构建(本地)Python 中获取软件包,而不是主机(跨)Python,或者需要crossenv或 QEMU 来运行主机 Python。为了避免这个问题,在您的跨文件中指定相关目录的路径:

[constants]
sitepkg  =  '/abspath/to/host-pythons/site-packages/'

[properties]
numpy-include-dir  =  sitepkg + 'numpy/core/include'
pythran-include-dir  =  sitepkg + 'pythran' 

要获取有关跨编译的更多详细信息和当前状态,请参阅:

构建可再分发的二进制文件

原文:docs.scipy.org/doc/scipy-1.12.0/building/redistributable_binaries.html

当使用python -m buildpip wheel构建 SciPy 轮子时,该轮子将依赖外部共享库(至少是 BLAS/LAPACK 和 Fortran 编译器运行时库,也许还有其他库)。因此,这样的轮子只能在构建它们的系统上运行。有关更多背景信息,请参阅 “构建和安装或上传工件”下的 pypackaging-native 内容

因此,这样的轮子是生成可分发的二进制文件的中间阶段。最终的二进制文件可能是一个轮子 - 在这种情况下,请运行auditwheel(Linux)、delocate(macOS)或delvewheel(Windows)来将所需的共享库打包到轮子中。

最终的二进制文件也可能是另一种打包格式(例如 .rpm.deb.conda 包)。在这种情况下,有特定于打包生态系统的工具,首先将轮子安装到临时区域,然后使该安装位置中的扩展模块可重定位(例如通过重写 RPATHs),最后将其重新打包为最终的包格式。

了解 Meson

原文链接:docs.scipy.org/doc/scipy-1.12.0/building/understanding_meson.html

构建 SciPy 依赖于以下工具,这些工具可视为构建系统的一部分:

  • meson:Meson 构建系统,可作为纯 Python 包从 PyPI 或 conda-forge 安装

  • ninja:Meson 调用的实际构建工具(例如,调用编译器)。也可以从 PyPI(所有常见平台)或 conda-forge 安装。

  • pkg-config:用于发现依赖项(特别是 BLAS/LAPACK)的工具。在 conda-forge(以及 Homebrew、Chocolatey 和 Linux 包管理器)可用,但未在 PyPI 上打包。

  • meson-python:Python 构建后端(即通过pyproject.toml中的钩子由pippypa/build调用的东西)。这是 Meson 之上的一个薄层,主要作用是(a)与构建前端接口,以及(b)生成具有有效文件名和元数据的 sdists 和 wheels。

使用 Meson 进行构建分为几个阶段:

  • 配置阶段(meson setup)用于检测编译器、依赖项和构建选项,并创建构建目录和build.ninja文件,

  • 编译阶段(meson compileninja),在这里编译作为构建 SciPy 包的一部分的扩展模块,

  • 安装阶段(meson install)用于从源和构建目录安装可安装文件到目标安装目录,

Meson 拥有良好的构建依赖跟踪系统,因此第二次调用构建将仅重新构建任何源或依赖项发生更改的目标。

了解更多关于 Meson 的信息

Meson 拥有非常好的文档;阅读它是值得的,通常也是“如何做 X”的最佳答案来源。此外,可以免费获取 Meson 的详尽 pdf 书籍,网址为nibblestew.blogspot.com/2021/12/this-year-receive-gift-of-free-meson.html

若要了解 Meson 使用的设计原则的更多信息,最近链接的讲座从mesonbuild.com/Videos也是一个很好的资源。

构建阶段的解释

这仅供教学目的;不应单独执行这些阶段。根目录中的 dev.py 脚本也包含这些步骤,并且可以用于深入研究。

假设我们从一个干净的 repo 和完全设置好的 conda 环境开始:

git clone git@github.com:scipy/scipy.git
git submodule update --init
mamba env create -f environment.yml
mamba activate scipy-dev 

现在运行构建的配置阶段,并指示 Meson 将构建工件放在相对于 repo 根目录的build/和本地安装在build-install/下,请执行:

meson setup build --prefix=$PWD/build-install 

然后运行构建的编译阶段,请执行:

ninja -C build 

在上述命令中,-C后面跟着构建目录的名称。您可以同时拥有多个构建目录。Meson 是完全非原位的,因此这些构建不会相互干扰。例如,您可以在不同的目录中拥有 GCC 构建、Clang 构建和调试构建。

然后将 SciPy 安装到前缀(build-install/这里,但请注意这只是我们随意选择的名称):

meson install -C build 

然后它将安装到build-install/lib/python3.11/site-packages/scipy,这不在您的 Python 路径中,所以要添加它(再次强调,这是为了学习目的,显式使用PYTHONPATH通常不是最佳选择):

export PYTHONPATH=$PWD/build-install/lib/python3.11/site-packages/ 

现在我们应该能够导入scipy并运行测试。请记住,我们需要移出仓库的根目录,以确保我们使用的是包而不是本地的scipy/源目录。

cd doc
python -c "from scipy import constants as s; s.test()" 

上述命令运行单个模块constants的测试。还有其他运行测试的方法,例如:

pytest --pyargs scipy 

完整的测试套件应该通过,在 Linux 上没有任何构建警告(至少在 CI 中强制使用-Werror的 GCC 版本),在其他平台上最多只能有少量警告。

检查构建步骤

原文链接:docs.scipy.org/doc/scipy-1.12.0/building/introspecting_a_build.html

当您遇到特定 Python 扩展模块或其他构建目标的问题时,有多种方法可以确切了解构建系统正在执行的操作。除了查看感兴趣目标的meson.build内容外,这些还包括:

  1. 在构建目录中阅读生成的build.ninja文件,

  2. 使用meson introspect了解有关目标的构建选项、依赖项和使用的标志,

  3. 阅读<build-dir>/meson-info/*.json以获取有关发现的依赖项、Meson 文件安装位置等详细信息。

所有这些内容都在构建的配置阶段之后(即meson setup运行后)可用。通常,查看此信息比运行构建并阅读完整的构建日志更有效。

ninja.build文件

例如,假设我们对scipy.linalg._decomp_update感兴趣。从scipy/linalg/meson.build我们了解到此扩展是使用模板化的 Cython 代码编写的,并且除了numpy目录外没有使用任何特殊的编译标志或包含目录。因此,下一步是查看build.ninja。在编辑器中打开该文件并搜索_decomp_update。您将找到适用的一组通用和特定目标的规则(注意,此代码块中的注释不在build.ninja中,仅在此文档部分中添加以解释正在发生的事情)。

# These rules are usually not needed to understand the problem, but can be looked up at the top of the file:
rule  c_COMPILER
  command  =  /home/username/anaconda3/envs/scipy-dev/bin/x86_64-conda-linux-gnu-cc  $ARGS  -MD  -MQ  $out  -MF  $DEPFILE  -o  $out  -c  $in
  deps  =  gcc
  depfile  =  $DEPFILE_UNQUOTED
  description  =  Compiling  C  object  $out

rule  c_LINKER
  command  =  /home/username/anaconda3/envs/scipy-dev/bin/x86_64-conda-linux-gnu-cc  $ARGS  -o  $out  $in  $LINK_ARGS
  description  =  Linking  target  $out

# step 1: `.pyx.in` to `.pyx` code generation with Tempita
build  scipy/linalg/_decomp_update.pyx:  CUSTOM_COMMAND  ../scipy/linalg/_decomp_update.pyx.in  |  ../scipy/_build_utils/tempita.py  /home/username/anaconda3/envs/scipy-dev/bin/python3.10
  COMMAND  =  /home/username/anaconda3/envs/scipy-dev/bin/python3.10  ../scipy/_build_utils/tempita.py  ../scipy/linalg/_decomp_update.pyx.in  -o  scipy/linalg
  description  =  Generating$  scipy/linalg/_decomp_update$  with$  a$  custom$  command

# step 2: `.pyx` to `.c` compilation with Cython
build  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/_decomp_update.c:  CUSTOM_COMMAND  scipy/linalg/_decomp_update.pyx  |  /home/username/code/scipy/scipy/_build_utils/cythoner.py  scipy/__init__.py  scipy/linalg/__init__.py  scipy/linalg/cython_blas.pyx
  DESC  =  Generating$  'scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/_decomp_update.c'.
  COMMAND  =  /home/username/anaconda3/envs/scipy-dev/bin/python3.10  /home/username/code/scipy/scipy/_build_utils/cythoner.py  scipy/linalg/_decomp_update.pyx  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/_decomp_update.c

# step 3: use C compiler to go from `.c` to object file (`.o`)
build  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/meson-generated__decomp_update.c.o:  c_COMPILER  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/_decomp_update.c
  DEPFILE  =  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/meson-generated__decomp_update.c.o.d
  DEPFILE_UNQUOTED  =  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/meson-generated__decomp_update.c.o.d
  ARGS  =  -Iscipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p  -Iscipy/linalg  -I../scipy/linalg  -I/home/username/anaconda3/envs/scipy-dev/lib/python3.10/site-packages/numpy/core/include  -I/home/username/anaconda3/envs/scipy-dev/include/python3.10  -fvisibility=hidden  -fdiagnostics-color=always  -D_FILE_OFFSET_BITS=64  -Wall  -Winvalid-pch  -std=c99  -O2  -g  -Wno-unused-but-set-variable  -Wno-unused-function  -Wno-conversion  -Wno-misleading-indentation  -fPIC  -Wno-cpp

# step 4: generate a symbol file (uses `meson --internal symbolextractor`); you can safely ignore this step
build  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/_decomp_update.cpython-310-x86_64-linux-gnu.so.symbols:  SHSYM  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so
  IMPLIB  =  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so

# step 5: link the `.o` file to obtain the file extension module (`.so`)
build  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so:  c_LINKER  scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/meson-generated__decomp_update.c.o  |  /home/username/anaconda3/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/lib64/libm-2.12.so  /home/username/anaconda3/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/lib64/libm.a
  LINK_ARGS  =  -L/home/username/anaconda3/envs/scipy-dev/lib  -Wl,--as-needed  -Wl,--allow-shlib-undefined  -shared  -fPIC  -Wl,--start-group  -lm  -Wl,--end-group  -Wl,-O2  -Wl,--sort-common  -Wl,--as-needed  -Wl,-z,relro  -Wl,-z,now  -Wl,--disable-new-dtags  -Wl,--gc-sections  -Wl,--allow-shlib-undefined  -Wl,-rpath,/home/username/anaconda3/envs/scipy-dev/lib  -Wl,-rpath-link,/home/username/anaconda3/envs/scipy-dev/lib 

使用meson introspect

如果我们想从另一个角度查看_decomp_update,可以使用(例如)meson introspect --targets -i <build-dir> > targets.json生成可读的 JSON。搜索生成的文件以查找我们感兴趣的目标显示:

{
  "name":  "_decomp_update",
  "id":  "b4ac6f0@@_decomp_update@cus",
  "type":  "custom",
  "defined_in":  "/home/username/code/scipy/scipy/linalg/meson.build",
  "filename":  [
  "/home/username/code/scipy/build/scipy/linalg/_decomp_update.pyx"
  ],
  "build_by_default":  false,
  "target_sources":  [
  {
  "language":  "unknown",
  "compiler":  [
  "/home/username/anaconda3/envs/scipy-dev/bin/python3.10",
  "/home/username/code/scipy/scipy/_build_utils/tempita.py",
  "@INPUT@",
  "-o",
  "@OUTDIR@"
  ],
  "parameters":  [],
  "sources":  [
  "/home/username/code/scipy/scipy/linalg/_decomp_update.pyx.in"
  ],
  "generated_sources":  []
  }
  ],
  "extra_files":  [],
  "subproject":  null,
  "installed":  false
},
{
  "name":  "_decomp_update.cpython-310-x86_64-linux-gnu",
  "id":  "b4ac6f0@@_decomp_update.cpython-310-x86_64-linux-gnu@sha",
  "type":  "shared module",
  "defined_in":  "/home/username/code/scipy/scipy/linalg/meson.build",
  "filename":  [
  "/home/username/code/scipy/build/scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so"
  ],
  "build_by_default":  true,
  "target_sources":  [
  {
  "language":  "c",
  "compiler":  [
  "/home/username/anaconda3/envs/scipy-dev/bin/x86_64-conda-linux-gnu-cc"
  ],
  "parameters":  [
  "-I/home/username/code/scipy/build/scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p",
  "-I/home/username/code/scipy/build/scipy/linalg",
  "-I/home/username/code/scipy/scipy/linalg",
  "-I/home/username/anaconda3/envs/scipy-dev/lib/python3.10/site-packages/numpy/core/include",
  "-I/home/username/anaconda3/envs/scipy-dev/include/python3.10",
  "-fvisibility=hidden",
  "-fdiagnostics-color=always",
  "-D_FILE_OFFSET_BITS=64",
  "-Wall",
  "-Winvalid-pch",
  "-std=c99",
  "-O2",
  "-g",
  "-Wno-unused-but-set-variable",
  "-Wno-unused-function",
  "-Wno-conversion",
  "-Wno-misleading-indentation",
  "-fPIC",
  "-Wno-cpp"
  ],
  "sources":  [],
  "generated_sources":  [
  "/home/username/code/scipy/build/scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so.p/_decomp_update.c"
  ]
  }
  ],
  "extra_files":  [],
  "subproject":  null,
  "installed":  true,
  "install_filename":  [
  "/home/username/code/scipy/build-install/lib/python3.10/site-packages/scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so"
  ]
}, 

这告诉我们很多信息,例如将使用哪些包含目录、Cython 生成的 C 代码在何处找到以及使用了哪些编译标志。meson introspect --help对其全部功能范围和使用方法有很好的文档。

meson-info JSON 文件

<build-dir>/meson-info/中有许多不同的 JSON 文件。这些文件具有描述性名称,暗示其内容。例如,最终的_decomp_update扩展安装到何处在intro-install_plan.json中描述(注意,这些文件未经美化打印,通过 JSON 格式化器运行它们有助于):

"/home/username/code/scipy/build/scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so":{
  "destination":"{py_platlib}/scipy/linalg/_decomp_update.cpython-310-x86_64-linux-gnu.so",
  "tag":"runtime"
}, 

我们还可能对检测到的依赖项在构建的配置阶段有何安装计划等情况感兴趣。因此,我们查看intro-dependencies.json

[
  {
  "name":"python",
  "version":"3.10",
  "compile_args":[
  "-I/home/username/anaconda3/envs/scipy-dev/include/python3.10"
  ],
  "link_args":[

  ]
  },
  {
  "name":"openblas",
  "version":"0.3.20",
  "compile_args":[
  "-I/home/username/anaconda3/envs/scipy-dev/include"
  ],
  "link_args":[
  "/home/username/anaconda3/envs/scipy-dev/lib/libopenblas.so"
  ]
  },
  {
  "name":"threads",
  "version":"unknown",
  "compile_args":[
  "-pthread"
  ],
  "link_args":[
  "-pthread"
  ]
  }
] 

这告诉我们有三个发现的依赖项。注意:numpy和其他几个构建时依赖项因尚未使用内置的dependency() Meson 命令进行搜索而未列出。

Meson 和 distutils 的工作方式

原文链接:docs.scipy.org/doc/scipy-1.12.0/building/distutils_equivalents.html

旧的工作流(基于 numpy.distutils):

runtests.py 文件在提交 0f73f92255253ec5dff2de5ca45d8d3bdda03f92 中已被移除 [¹^_]。

  1. python runtests.py

  2. python setup.py build_ext -i + export PYTHONPATH=/home/username/path/to/scipy/reporoot(然后在 SciPy 中编辑纯 Python 代码并使用 python some_script.py 运行)。

  3. python setup.py develop - 这与(2)类似,除了在地方构建永久可见于环境中。

  4. python setup.py bdist_wheel + pip install dist/scipy*.whl - 在当前环境中构建 wheel(即使用已安装的 numpy 等)并安装它。

  5. pip install . - 在与 pyproject.toml 中的依赖项进行隔离构建并安装 wheel。注意:请小心,这通常不是用于开发安装的正确命令 - 通常你应该使用 (4) 或 pip install . -v --no-build-isolation

新的工作流(基于 Meson 和 meson-python):

  1. python dev.py

  2. pip install -e . --no-build-isolation(参见 meson-python 文档)

  3. 与(2)相同

  4. python -m build --no-isolation + pip install dist/scipy*.whl - 参见 pypa/build

  5. pip install .

[¹^_]: GitHub 上的提交 0f73f92255253ec5dff2de5ca45d8d3bdda03f92

开发者文档

原文:docs.scipy.org/doc/scipy-1.12.0/dev/index.html

下面您将找到有关贡献的一般信息。如需了解期望或计划在哪里需要帮助或新功能,请参阅路线图。如需更详细地了解 SciPy 项目的工作方式,请参阅组织部分。

贡献信息

  • SciPy 行为准则

  • 贡献方式

  • 贡献者快速入门指南

  • 开发工作流程

  • SciPy 贡献者指南

路线图

  • SciPy 路线图

  • 详细的 SciPy 路线图

  • 工具链路线图

SciPy 组织

  • SciPy 核心开发者指南

  • SciPy API 开发指南

  • SciPy 项目治理

贡献信息

SciPy 行为准则

原文链接:docs.scipy.org/doc/scipy-1.12.0/dev/conduct/code_of_conduct.html

简介

此行为准则适用于 SciPy 项目管理的所有空间,包括所有公共和私人邮件列表、问题跟踪器、维基、博客、Twitter 以及我们社区使用的任何其他沟通渠道。虽然 SciPy 项目不组织面对面的活动,但与我们社区相关的活动应具有与此相似精神的行为准则。

所有参与 SciPy 社区的人士,无论是正式参与还是非正式参与,或者声称与项目有任何关联的人,在任何与项目相关的活动中,特别是在代表项目时,都应遵守此行为准则。

此代码既不详尽也不完整。它用来概括我们对协作共享环境和目标的共同理解。请尽量遵循这一准则的精神,创造一个友好且富有成效的环境,以丰富周围的社区。

具体指南

我们努力做到:

  1. 请保持开放。我们欢迎任何人参与我们的社区。我们更倾向于使用公共沟通方法进行项目相关消息的传递,除非讨论的内容比较敏感。这也适用于帮助或项目相关支持的请求;公共支持请求不仅更有可能得到问题的答复,还能确保更容易发现和纠正任何不小心的错误。

  2. 具有共情、欢迎、友好和耐心。我们共同努力解决冲突,并假设他人有良好的意图。我们每个人偶尔可能会感到一些挫折,但我们不允许挫折演变成个人攻击。一个让人感到不舒服或受到威胁的社区是没有生产力的。

  3. 请务必协作。我们的工作将被他人使用,反过来我们也会依赖于他人的工作。当我们为项目利益而创造某事物时,我们愿意向他人解释其工作原理,以便他们能够在此基础上进行改进。我们做出的每一个决定都会影响用户和同事,因此我们在决策时认真对待这些后果。

  4. 请多提问题。没有人什么都懂!早些时候提问可以避免后面的很多问题,因此我们鼓励提问,尽管我们可能会把它们指向适当的论坛。我们将尽力响应并提供帮助。

  5. 我们在选择用词时要小心谨慎。在沟通中,我们要谨慎和尊重,对自己的言论负责任。善待他人。不要侮辱或贬低其他参与者。我们不会接受骚扰或其他排斥行为,例如:

  • 针对他人的暴力威胁或语言。
  • 性别歧视、种族歧视或其他歧视性笑话和用语。
  • 发布性别暴露或暴力材料。
  • 发布(或威胁发布)他人的个人身份信息(“doxing”)。
  • 分享私人内容,如私下发送的电子邮件或非公开的内容,或未经发件人同意的未记录论坛,如 IRC 频道历史。
  • 个人侮辱,尤其是使用种族主义或性别歧视的词语。
  • 不受欢迎的性别关注。
  • 过度的粗俗语言。请避免使用脏话;人们对脏话的敏感程度大不相同。
  • 反复骚扰他人。一般来说,如果有人要求您停止,那么请停止。
  • 提倡或鼓励上述任何行为。

多样性声明

SciPy 项目欢迎并鼓励所有人参与。我们致力于打造一个每个人都乐于参与的社区。尽管我们可能无法始终满足每个人的偏好,但我们会尽力友善对待每一位成员。

无论您如何定义自己或他人如何看待您:我们都欢迎您。尽管没有任何一份清单可以涵盖所有情况,我们明确尊重:年龄、文化、种族、基因型、性别认同或表达、语言、国籍、神经类型、表型、政治信仰、职业、种族、宗教、性取向、社会经济地位、亚文化和技术能力,只要这些不与本行为准则冲突。

尽管我们欢迎使用所有语言流利的人,但 SciPy 的开发工作是用英语进行的。

SciPy 社区的行为标准详见上述《行为准则》。我们社区的参与者应在所有互动中遵守这些标准,并帮助他人也做到如此(请参见下一节)。

报告指南

我们知道,在互联网上,通信往往以或演变为明显且公然的滥用。我们也意识到,有时人们可能会有不好的一天,或者对这些行为准则中的某些指导不太了解。在决定如何回应违反这一准则时,请记住这一点。

对于明显故意违反的情况,请向行为准则委员会报告(详见下文)。对于可能无意的违规行为,您可以在公开或私下向当事人指出此行为准则。如果您不愿意这样做,请随时直接向行为准则委员会报告,或者寻求委员会的建议,保证您的信息不会泄露。

您可以向 SciPy 行为准则委员会报告问题,联系邮箱为 scipy-conduct@googlegroups.com。目前,委员会成员包括:

  • Stefan van der Walt

  • Nathaniel J. Smith

  • Ralf Gommers

如果您的报告涉及任何委员会成员,或者他们觉得自己在处理中存在利益冲突,那么他们将自行退出考虑您的报告。或者,如果出于任何原因,您感到不舒服向委员会报告,您也可以联系:

  • SciPy Steering Committee 主席:Ralf Gommers 或

  • 高级NumFOCUS 员工:conduct@numfocus.org

事件报告解决与行为准则执行

本节总结了最重要的点,更多细节请参阅 SciPy 行为准则 - 如何跟进报告。

我们将调查并回应所有投诉。SciPy 行为准则委员会和 SciPy 指导委员会(如果涉及)将保护报告人的身份,并将投诉内容视为保密(除非报告人另有同意)。

在严重且明显违规情况下,例如人身威胁或使用暴力、性别歧视或种族主义言论,我们将立即将发起者从 SciPy 通讯渠道中断开;详细信息请参阅手册。

对于不涉及明显严重违规的情况,处理接收到的行为准则违规报告的过程将是:

  1. 确认已收到报告

  2. 合理的讨论/反馈

  3. 调解(如果反馈没有帮助,并且只有报告人和被报告人同意)

  4. 透明决策执行(见决议),由行为准则委员会负责。

委员会将尽快回复任何报告,并且最迟在 72 小时内做出回应。

尾注

我们感谢以下文档背后的团体,我们从中获取内容和灵感:

贡献方式

原文:docs.scipy.org/doc/scipy-1.12.0/dev/hacking.html

本文旨在概述向 SciPy 贡献的方式。它试图回答常见问题并提供一些关于社区实际工作流程的见解。熟悉 SciPy 社区并且是有经验的 Python 编码者的读者可能希望直接跳转到 SciPy 贡献者指南。

有很多方式可以贡献:

  • 贡献新代码

  • 修复错误,改进文档,以及其他维护工作

  • 审查开放的拉取请求

  • 问题分类

  • scipy.org 网站上工作

  • 回答问题并参与 scipy-dev 和 scipy-user 的邮件列表

贡献新代码

如果你已经使用科学 Python 工具栈一段时间,可能会有一些代码堆积,你会觉得“这对其他人也可能有用”。也许将其贡献给 SciPy 或其他开源项目是个不错的主意。首先要问的问题是,这些代码应该放在哪里?这个问题在这里很难回答,所以我们从更具体的问题开始:哪些代码适合放入 SciPy? 添加到 SciPy 的几乎所有新代码都具有一个共同点,那就是它在多个科学领域中有潜在的用途,并且它适合于现有 SciPy 子包的范围内(参见决定新功能)。原则上,也可以添加新的子包,但这种情况较少见。对于特定于单一应用程序的代码,可能已经存在可以使用该代码的现有项目。一些 SciKits(例如scikit-learnscikit-imagestatsmodels等)在这里是很好的例子;它们的焦点更窄,因此比 SciPy 具有更多领域特定的代码。

现在,如果你有想要包含在 SciPy 中的代码,你应该怎么做呢?在确认你的代码可以在兼容的许可下分发给 SciPy 之前(参见许可考虑),第一步是在 scipy-dev 邮件列表上讨论。所有新功能以及对现有代码的更改都在那里讨论和决定。你可以在你的代码完成之前开始这个讨论。请记住,为了添加到 SciPy 中,你的代码需要被其他人审查,因此尽量找到愿意审查你工作的人。

假设邮件列表上的讨论结果是积极的,并且你有一个能做你需要的事情的函数或代码片段,接下来呢?在代码添加到 SciPy 之前,它至少需要有良好的文档、单元测试、基准测试以及正确的代码风格。

  1. 单元测试

    原则上,你应该创建能够测试你添加的所有代码的单元测试。这样可以在一定程度上确保你的代码在不同 Python 版本和你自己无法获得的硬件或操作系统上也能正确运行。如何撰写单元测试的详细描述可以在测试指南中找到,而本地运行 SciPy 测试则说明了如何运行这些测试。

  2. 基准测试

    单元测试检查正确功能;基准测试衡量代码性能。并非所有现有的 SciPy 代码都有基准测试,但应该有:随着 SciPy 的发展,监控执行时间以捕获意外的性能回归变得越来越重要。有关如何撰写和运行基准测试的更多信息可以在 Benchmarking SciPy with airspeed velocity 中找到。

  3. 文档

    清晰完整的文档对于用户能够查找和理解代码至关重要。单个函数和类的文档,包括至少基本描述、所有参数和返回值的类型和含义,以及doctest格式的使用示例,都放在文档字符串中。这些文档字符串可以在解释器中阅读,并编译成 HTML 和 pdf 格式的参考指南。关于如何撰写文档的指南可以在文档风格中找到,而使用 Sphinx 本地渲染文档则解释了如何预览文档,看起来就像在线一样。

  4. 代码风格

    统一的代码风格可以让其他人更容易阅读你的代码。SciPy 遵循标准的 Python 风格指南,PEP8,唯一的例外是推荐的最大行长度为 88 个字符,而不是 PEP8 的 79 个字符。

    我们提供一个 git 预提交钩子,可以检查每个提交的风格是否正确。通过以下命令在 SciPy 存储库的根目录安装它(一次性):

    cp tools/pre-commit-hook.py .git/hooks/pre-commit 
    

    或者,您也可以手动运行代码检查工具:

    python dev.py lint 
    

    大多数集成开发环境(IDE)和文本编辑器都有设置,可以帮助你遵循 PEP8,例如将制表符转换为四个空格。更多信息可以在 PEP8 和 SciPy 中找到。

一个检查清单,包括这些和其他要求,可以在示例的末尾开发工作流程中找到。

您可能还有另一个问题:我应该把我的代码放在哪里?要回答这个问题,了解 SciPy 的公共 API(应用程序编程接口)的定义是很有用的。对于大多数模块来说,API 是两层深度的,这意味着您的新函数应该出现为 scipy.subpackage.my_new_funcmy_new_func 可以放在 /scipy/<subpackage>/ 下的现有或新文件中,其名称应添加到该文件中的 __all__ 列表中(该列表列出文件中的所有公共函数),然后在 /scipy/<subpackage>/__init__.py 中导入这些公共函数。任何私有函数/类的名称应该以下划线(_)开头。SciPy 的公共 API 的更详细描述在 SciPy API 中给出。

一旦您认为您的代码准备好包含在 SciPy 中,您可以在 Github 上发送一个拉取请求(PR)。我们不会在这里详细讨论如何使用 git,这在 Git for development 和 Github 帮助页面 中有很好的描述。当您为一个新功能发送 PR 时,请确保在 scipy-dev 邮件列表上也提及此事。这可以促使感兴趣的人帮助审查您的 PR。假设您之前已经得到了关于您的代码/功能的总体想法的积极反馈,那么代码审查的目的是确保代码正确、高效并符合上述要求。在许多情况下,代码审查会相对快速完成,但也可能会停滞。如果您已经处理了所有已给反馈,那么在一定合理的时间(比如几周)之后,再次在邮件列表上请求审查是完全可以的。一旦审查完成,PR 就会合并到 SciPy 的“main”分支中。

上述描述了向 SciPy 添加代码的要求和过程。但它并没有准确回答决策是如何做出的问题。基本答案是:决策是通过共识达成的,由所有选择参与邮件列表讨论的人员决定。这包括开发人员、其他用户和你自己。在讨论中追求共识非常重要——SciPy 是科学 Python 社区的一个项目。在那些罕见的情况下,无法达成一致意见时,相关模块的维护者可以决定问题的解决方式。

许可证考虑

我基于我在网上找到的现有 Matlab/R/... 代码编写了我的代码,这样可以吗?

这取决于情况。SciPy 使用 BSD 许可证分发,因此如果您的代码基于的代码也是 BSD 许可证或具有 BSD 兼容许可证(例如 MIT、PSF),那么可以接受。如果代码是 GPL 或 Apache 许可证,没有明确的许可证,需要引用或仅适用于学术使用,则无法包含在 SciPy 中。因此,如果您复制了具有此类许可证的现有代码或直接将其翻译为 Python,则您的代码无法包含在内。如果您不确定,请在 scipy-dev 的邮件列表上咨询。

SciPy 为何采用 BSD 许可证而不是 GPL?

与 Python 一样,SciPy 使用“宽松”的开源许可证,允许专有重用。尽管如此,这使得公司可以在不返回任何东西的情况下使用和修改软件,但人们认为更大的用户基础会带来更多的贡献,公司通常也会发布它们的修改,而无需强制要求。请参阅约翰·亨特的BSD 提案

有关 SciPy 许可证的更多信息,请参阅 Licensing。

维护现有代码

前面的部分特别讨论了向 SciPy 添加新功能。讨论的很大一部分也适用于现有代码的维护。维护意味着修复错误,提高代码质量,更好地记录现有功能,添加缺失的单元测试,添加性能基准,保持构建脚本的更新等等。SciPy 的问题列表包含了所有报告的错误,构建/文档问题等。修复问题有助于提高 SciPy 的整体质量,并且也是熟悉项目的好方法。您可能还想修复一个错误,因为您遇到了这个问题,并且需要相关函数正常工作。

上述关于代码风格和单元测试的讨论同样适用于 bug 修复。通常最好先编写一个显示问题的单元测试,即该测试应该通过但实际未通过。一旦完成,您可以修复代码以使该测试通过。这应该足以为此问题发送一个 PR。与添加新代码时不同,可能不需要在邮件列表上讨论此问题 - 如果代码的旧行为显然是不正确的,那么没有人会反对将其修复。可能需要为更改后的行为添加一些警告或弃用消息。这应该是审查过程的一部分。

注意

不鼓励仅更改代码风格的拉取请求,例如修复文件中的一些 PEP8 问题。这些 PR 通常不值得在 git annotate 历史中堆砌,而且会占用审阅者的时间,这些时间可能更好地用在其他方面。但是,如果作为功能更改的一部分触及的代码进行了代码风格清理,则是可以接受的。

审查拉取请求

审查开放的拉取请求(PR)非常受欢迎,也是帮助项目前进速度的宝贵方式。如果您在特定领域具有特定的知识/经验(例如“优化算法”或“特殊函数”),那么审查该领域的 PR 尤为重要 - 有时具有技术代码的 PR 由于缺乏适当的审阅者而需要等待很长时间才能合并。

我们鼓励每个人参与审查过程;这也是熟悉代码库的好方法。审稿人应自问以下问题中的一些或全部:

  • 此更改是否充分讨论(适用于新功能和更改现有行为)?

  • 功能在科学上是否合理?算法可能基于文献已知工作;否则,对正确性的更近一步检查是宝贵的。

  • 在所有情况下,预期行为是否清晰(例如,如空数组或 nan/inf 值等意外输入)?

  • 代码是否符合贡献新代码部分概述的质量、测试和文档期望?

如果我们还不认识您,请考虑介绍自己。

其他贡献方式

除编写代码外,还有许多贡献方式。

故障排除问题(验证错误报告的有效性和可能的行动)也是一种有用的活动。SciPy 有数百个开放问题;关闭无效问题并正确标记有效问题(最好在评论中提出一些初步想法)允许优先处理维护工作,并在处理现有功能或子包时轻松找到相关问题。有关问题排查的更多信息,请阅读故障排查和问题管理。

参与 scipy-user 和 scipy-dev 邮件列表的讨论本身就是一种贡献。每个写信的人都希望得到回应,编写这些回应使项目和社区运行得更好,也更具欢迎性。

scipy.org 网站包含关于 SciPy 项目和 SciPy 社区的大量信息,而且它总是需要新的帮手。网站的源代码存放在自己的单独存储库中:github.com/scipy/scipy.org

开始

感谢您对贡献 SciPy 的兴趣!如果您有兴趣贡献代码,希望您继续阅读 SciPy 贡献者指南,了解如何设置开发环境、实现改进并提交首个 PR 的详细信息!

贡献者快速入门指南

原文链接:docs.scipy.org/doc/scipy-1.12.0/dev/dev_quickstart.html

在从 GitHub 获取源代码之后,有三个步骤可以开始贡献:

  1. 设置开发环境

    使用 mamba 或其他多种虚拟环境管理工具的一种,可以确保 SciPy 的开发版本不会干扰到你机器上的任何其他本地安装的 SciPy。

  2. 构建 SciPy

    SciPy 使用编译代码来提高速度,这意味着根据你的系统可能需要额外的依赖项才能完成此步骤 - 参见 从源码构建。

  3. 执行开发任务

    这些可以包括你想要对源代码进行的任何更改、运行测试、构建文档、运行基准测试等。

基本工作流程

注意

我们强烈建议使用用户激活的环境设置,例如 conda 或虚拟环境。

由于 SciPy 包含了用 C、C++ 和 Fortran 编写的部分内容,需要在使用之前进行编译,请确保已安装必要的编译器和 Python 开发头文件。如果你使用的是 mamba,这些将会自动安装。如果你使用 pip,请检查可能需要的 系统级依赖。

首先,在 GitHub 上将主要 SciPy 仓库的副本分叉到你自己的账户中,然后通过以下方式创建你的本地仓库:

git clone git@github.com:YOURUSERNAME/scipy.git scipy
cd scipy
git submodule update --init
git remote add upstream https://github.com/scipy/scipy.git 

接下来,设置你的开发环境。 系统级依赖 已安装 的情况下,从你的 SciPy 克隆 的基本目录中的终端执行以下命令:

# Create an environment with all development dependencies
mamba  env  create  -f  environment.yml  # works with `conda` too
# Activate the environment
mamba  activate  scipy-dev 
# Create the virtual environment
python  -m  venv  $HOME/.venvs/scipy-dev
# Activate the environment
source  $HOME/.venvs/scipy-dev/bin/activate
# Install python-level dependencies
python  -m  pip  install  numpy  pytest  cython  pythran  pybind11  meson  ninja  pydevtool  rich-click  hypothesis 

你的命令提示现在显示你的新环境名称,如 (scipy-dev)$

最后,为了开发 SciPy 并运行测试套件,请执行以下操作:

python dev.py test  # this will always (re)build as needed first 

请注意这将需要几分钟时间(默认情况下禁用了一些非常慢的测试),因此你可能只想测试你将要处理的 SciPy 的部分。有关如何执行此操作的详细信息,请参阅 开发工作流程 中的更完整设置步骤,或者 python dev.py test --help

其他工作流程

这只是设定开发环境的一种可能方式,具体指令请参见 SciPy 贡献者指南。

注意

如果你在从源码构建 SciPy 或设置本地开发环境时遇到问题,可以尝试使用 GitHub Codespaces 构建 SciPy。它允许你在浏览器中创建正确的开发环境,减少了安装本地开发环境和处理不兼容依赖项的需求。

如果您有良好的互联网连接并且想要临时设置,通常更快的方法是在 Codespaces 环境中工作。有关如何开始使用 Codespaces 的文档,请参阅Codespaces 文档。在为 scipy/scipy 存储库创建 codespace 时,默认的 2 核机型可用;4 核会稍快地构建和工作(但当然会减少您的免费使用小时数)。一旦您的 codespace 启动,您可以运行 conda activate scipy-dev,您的开发环境就完全设置好了 - 然后您可以按照 SciPy 文档的相关部分来构建、测试、开发、撰写文档并向 SciPy 贡献。

另一种选择是使用Gitpod。我们不再维护这个解决方案,但一些信息可以在我们文档的旧版本中找到。

开发工作流程

原文:docs.scipy.org/doc/scipy-1.12.0/dev/contributor/development_workflow.html

注:在阅读或之后,考虑观看 SciPy 开发工作流程 的示例,以修复 bug 并提交拉取请求。

本指南假定你已经创建了自己的 SciPy 仓库分支(副本),在你自己的机器上克隆了仓库,并从这个源代码构建了 SciPy。如果没有,请查看适合你系统的 从源码构建 页面。在开始之前,还有两件事你需要做一次:

  1. 在终端中,向 Git 介绍你自己:

    git config --global user.email you@yourdomain.com
    git config --global user.name "Your Name" 
    

    这些信息为你的工作贡献提供了认可,但请注意,如果你“推送”你的工作到 GitHub,这些信息将会变成公开可见。更多信息请参见 设置你的 Git 提交邮箱地址

  2. 导航到你本地 SciPy 仓库的根目录,并输入:

    git remote add upstream https://github.com/scipy/scipy.git 
    

    这将把名字 upstream 关联到位于 github.com/scipy/scipy.git 的官方 SciPy 仓库。请注意,当你克隆 SciPy 仓库的分支时,Git 已经将名字 origin 关联到你的分支上。你需要这两个 “远程” 的原因是,你通常会从官方仓库 upstream 开始,做出改动,然后把你的改动“推送”到你的分支 origin,然后提交一个“拉取请求”请求 SciPy 把你的改动从你的分支合并到官方仓库。

  3. 初始化 git 子模块:

    git submodule update --init 
    

    这将获取并更新 SciPy 所需的任何子模块(如 Boost)。

基本工作流程

简而言之:

  1. 每次编辑时,请为每组编辑启动一个功能分支。参见 下文。

  2. 开始吧!参见 下文。

  3. 完成后:

    • 贡献者:将你的功能分支推送到你自己的 Github 仓库,并创建一个拉取请求。

    • 核心开发者 如果你想在无需进一步审核的情况下推送更改,请参阅下文 这里 的注意事项。

这种工作方式有助于保持工作有序,并尽可能清晰地记录历史。

参见

有许多在线教程可以帮助你学习 git。关于特定 git 工作流的讨论,请参阅这些讨论:linux git workflow,以及 ipython git workflow

制作一个新的功能分支

首先,在终端中导航到 SciPy 根目录,并从upstream存储库获取新的提交:

git fetch upstream 

接下来,在上游存储库的主分支基础上创建一个新分支:

git checkout -b my-new-feature upstream/main 

或者,您可能希望保持自己仓库的主分支更新,并基于此创建一个新分支:

git checkout main
git rebase upstream/main
git checkout -b my-new-feature 

按顺序执行以下命令

  1. 确保您的本地仓库当前检出了main分支,

  2. 将所有最新的更改从upstream/main(SciPy 仓库的主分支)应用到您的本地main分支,并

  3. 创建并检出一个基于您本地main分支的新分支(使用 -b)。

无论如何,确保您的功能分支包含来自上游主分支的最新更改,以帮助避免提交拉取请求时的合并冲突

在继续之前,建议先构建并运行测试这个分支。假设您已经按照其中一个从源代码构建页面设置好了开发环境,您需要激活开发环境,然后运行测试(请注意,如果需要,dev.py test 命令将自动执行构建):

conda activate scipy-dev
python dev.py test -v 
```  ### 编辑工作流程

#### 概述

```py
# hack hack
git status # Optional
git diff # Optional
git add modified_file
git commit
# push the branch to your own Github repo
git push origin my-new-feature 

更详细地说,

  1. 进行一些更改。当您感觉已经完成了一个完整的、可工作的相关更改集时,继续下一步骤。

  2. 可选步骤:使用 git status 检查更改的文件(参见 git status)。您会看到如下列表:

    # On branch my-new-feature
    # Changed but not updated:
    #   (use "git add <file>..." to update what will be committed)
    #   (use "git checkout -- <file>..." to discard changes in working directory)
    #
    #  modified:   README
    #
    # Untracked files:
    #   (use "git add <file>..." to include in what will be committed)
    #
    #  INSTALL
    no changes added to commit (use "git add" and/or "git commit -a") 
    
  3. 可选步骤:使用 git diff 比较与上一个版本的更改(参见 git diff)。这将打开一个简单的文本浏览器界面,突出显示您的文件与上一个版本之间的差异。

  4. 使用 git add modified_file 添加任何相关修改或新文件(参见 git add)。这将把文件放入暂存区,即将添加到您的下一个提交的文件队列中。仅添加具有相关、完整更改的文件。将带有未完成更改的文件留到稍后提交。

  5. 要将暂存的文件提交到本地仓库的副本中,请运行 git commit。此时,将会打开一个文本编辑器,允许您编写提交消息。请阅读提交消息部分,确保您编写了格式正确且足够详细的提交消息。保存消息并关闭编辑器后,您的提交将被保存。对于简单的提交,可以使用 -m 标志通过命令行传递简短的提交消息。例如,git commit -am "ENH: Some message"

    在某些情况下,你会看到这种形式的提交命令:git commit -a。额外的 -a 标志会自动提交所有修改的文件并移除所有删除的文件。这可以节省你键入大量 git add 命令的时间;但是,如果不小心,它可能会向提交添加不必要的更改。欲了解更多信息,请参见 为什么使用 -a 标志? - 以及在 tangled working copy problem 中的有用用例描述。

  6. 将更改推送到您在 github 上分叉的仓库:

    git push origin my-new-feature 
    

    欲了解更多信息,请参见 git push

注意

假设你已经按照这些页面的说明操作,git 将会为你的 github 仓库创建一个名为 origin 的默认链接。在 git >= 1.7 中,你可以通过使用 --set-upstream 选项来永久设置到 origin 的链接:

git push --set-upstream origin my-new-feature 

从现在开始,git 将会知道 my-new-feature 与你自己的github 仓库中的 my-new-feature 分支相关联。随后的推送调用将简化为以下内容:

git push 

对于每个新分支的创建,你必须使用--set-upstream

可能在您编辑时,已经有新的提交添加到 upstream,这些提交可能会影响到您的工作。在这种情况下,按照 在主分支上重新基础 的说明将这些更改应用到您的分支上。

撰写提交信息

提交信息应当清晰,并遵循几个基本规则。例如:

ENH: add functionality X to SciPy.<submodule>.

The first line of the commit message starts with a capitalized acronym
(options listed below) indicating what type of commit this is. Then a blank
line, then more text if needed.  Lines shouldn't be longer than 72
characters.  If the commit is related to a ticket, indicate that with
"See #3456", "See ticket 3456", "Closes #3456", or similar. 

描述变更的动机,修复 bug 的性质或者增强功能的细节都是值得在提交信息中包含的。提交信息应该在不查看代码变更的情况下也能够理解。像 MAINT: fixed another one 这样的提交信息就是不好的例子;读者必须去寻找其他上下文来理解。

提交信息的标准首字母缩写包括:

API: an (incompatible) API change
BENCH: changes to the benchmark suite
BLD: change related to building SciPy
BUG: bug fix
DEP: deprecate something, or remove a deprecated object
DEV: development tool or utility
DOC: documentation
ENH: enhancement
MAINT: maintenance commit (refactoring, typos, etc.)
REV: revert an earlier commit
STY: style fix (whitespace, PEP8)
TST: addition or modification of tests
REL: related to releasing SciPy 

注意

你可以添加一些标记来跳过连续集成的部分。参见 连续集成。#### 请求将您的更改与主仓库合并

当你觉得你的工作完成时,你可以创建一个拉取请求(PR)。Github 有一个很好的帮助页面介绍了 如何提交拉取请求

如果您的更改涉及对 API 的修改或者函数的添加/修改,您应该启动一次代码审查。这包括向 SciPy 邮件列表 发送一封带有您 PR 链接以及变更描述和动机的电子邮件。#### 提交 PR 之前的检查清单

  • 您确认代码可以根据 BSD 许可证分发吗?请参阅许可证考虑。

  • 是否有良好代码覆盖率的单元测试?请参阅NumPy/SciPy 测试指南

  • 所有单元测试在本地都通过了吗?请参阅从源代码构建 SciPy 开发。

  • 所有公共函数都有文档字符串,包括示例吗?请参阅numpydoc 文档字符串指南

  • 文档是否正确渲染?请参阅使用 Sphinx 在本地渲染文档。

  • 代码风格是否正确?请参阅 PEP8 和 SciPy。

  • 是否有基准测试?请参阅使用 airspeed velocity 对 SciPy 进行基准测试。

  • 提交消息格式是否正确?请参阅正确格式化的提交消息

  • 新功能的文档字符串是否标记为.. versionadded:: X.Y.Z(其中X.Y.Z是下一个版本的版本号)?例如,请参阅differential_evolutionupdatingworkersconstraints文档。

  • 如果有较大的新增内容,是否有教程或更详细的模块级描述?教程文件在doc/source/tutorial中。

  • 如果新增文件,它们是否通过meson.build正确集成?有关更多信息,请参阅编译代码。

SciPy 贡献者指南

原文链接:docs.scipy.org/doc/scipy-1.12.0/dev/contributor/contributor_toc.html

本指南旨在帮助您在查看了《贡献方式》[../hacking.html#hacking]或《贡献者快速入门指南》[../dev_quickstart.html#dev-quickstart]的入门材料后,快速找到关于 SciPy 开发的信息。

您还可以观看SciPy 开发工作流程,这是一个修复错误并提交 Pull 请求的五分钟视频示例(注意:此视频来自 2018 年,因此构建步骤现在已有所不同,但总体工作流程仍然相同)。

  • 从源代码构建 - 如何设置开发环境,包括安装编译器和 SciPy 依赖项,在 GitHub 上克隆 SciPy 存储库并更新 git 子模块,并使用dev.py接口进行构建和运行测试。

  • 编辑 SciPy - 如何编辑 SciPy Python 代码,包括查找包含 SciPy 功能的模块、向 SciPy 添加新模块以及符合 PEP8 样式标准的技巧

  • 单元测试 - 如何使用 pytest 框架编写和运行 SciPy 的单元测试

  • 文档 - 如何编写符合 docstring 标准的 reStructuredText 文档,本地使用 Sphinx 构建文档,并查看在持续集成检查期间构建的文档

  • 基准测试 - 如何使用 airspeed velocity 对代码进行基准测试

  • 编译代码 - 如何将快速编译的代码添加到 SciPy

  • 持续集成 - 我们的持续集成系统是如何工作的以及如何调试您的 PR

编辑 SciPy

  • 开发工作流程 描述了在设置完开发环境后应该做什么

  • PEP8 和 SciPy 提供了确保您的代码符合 PEP8 规范的一些技巧

  • 用于开发的 Git 是使用git的指南,这是一个分布式版本控制系统,用于管理来自世界各地对 SciPy 代码所做的更改

  • SciPy API 包含了关于 SciPy 代码组织方式的重要注释,并记录了 SciPy API 的结构;如果您打算导入其他 SciPy 代码,请先阅读本文。

  • 审查 Pull 请求 解释了如何在本地审查其他作者的 SciPy 代码

  • 问题分类和策划 解释了如何策划问题和 PR,并介绍了 SciPy 的 GitHub 团队权限工作方式

  • 添加新方法、函数和类 包含了如何添加新方法、函数和类的信息

  • SciPy 核心开发者指南 包括背景信息,包括如何做出决策和准备发布;面向核心开发者,但对所有贡献者都包含有用信息

  • 代码和文档风格指南 - 缺失的部分 - 代码和文档风格指南 ## 单元测试

  • 测试指南 是撰写 NumPy 或 SciPy 代码单元测试的权威指南(NumPy 文档的一部分)

  • 在本地运行 SciPy 测试记录了构建 SciPy 并在本地运行测试的命令 dev.py test ## 文档

  • 文档风格 包含了撰写文档字符串的一切知识,这些文档字符串通过Sphinx渲染为 HTML 文档(NumPy 文档的一部分)

  • 为 SciPy 文档做贡献 包含有关如何为 SciPy 文档做出贡献的信息

  • 在本地使用 Sphinx 渲染文档 在合并 PR 前检查文档如何渲染是非常重要的;本文档解释了您可以如何做到这一点 ## 基准测试

  • 使用 airspeed velocity 对 SciPy 进行基准测试 解释了如何使用airspeed velocity为 SciPy 添加基准测试 ## 编译代码

  • 向 SciPy 添加 Cython 使用Cython扩展和编译 Python 代码可以显著提高其性能;本文档帮助您入门

  • 超越 Python 讨论了在 SciPy 中使用 C、C++ 和 Fortran 代码的情况

  • 公共 Cython API 关于公开 Cython API 的指导方针

ROADMAP

SciPy 路线图

原文链接:docs.scipy.org/doc/scipy-1.12.0/dev/roadmap.html

此路线图页面仅包含 SciPy 未来发展的最重要想法和需求。更详细的路线图,包括每个子包的状态、更多的想法、API 稳定性等,请参见详细的 SciPy 路线图。

支持分布式数组和 GPU 数组

NumPy 已经通过__array_function____array_ufunc__将其 API 与执行引擎分离。这将使得 SciPy 的部分接受分布式数组(例如dask.array.Array)和 GPU 数组(例如cupy.ndarray),这些数组实现了ndarray接口。目前还不清楚哪些算法可以直接使用,以及它们是否在使用时能够获得显著的性能提升。我们希望创建一个 SciPy API 的映射,并随着时间的推移改进支持。

除了利用 NumPy 的协议如__array_function__,我们还可以在 SciPy 中使用这些协议。这将使得可以(重新)实现 SciPy 函数,例如在 Dask 或 GPU 数组中的scipy.signal函数(参见NEP 18 - use outside of NumPy)。NumPy 在这些领域的功能仍在不断发展中,例如参见NEP 37 - A dispatch protocol for NumPy-like modules,而 SciPy 对于这些功能是一个重要的“客户”。

性能改进

加速算法的速度改进,减少内存使用和能够并行化算法对大多数科学领域和使用案例都有益处。我们已经为多进程设计了一个 API 设计模式 - 使用workers关键字 - 可以在更多的函数中采用。

通过像 Pythran 这样的加速器启用,可能通过 Transonic 实现,并使用户能够更轻松地在依赖于 SciPy 功能的代码中使用 Numba 的@njit,这将带来大量的性能提升。不过,这需要一个策略,所有的解决方案仍在成熟中(参见例如此概览)。

最后,许多单独的函数可以针对性能进行优化。尤其是在scipy.optimizescipy.interpolate函数方面经常被请求进行优化。

统计增强

对于scipy.stats中的增强功能以及详细的 SciPy 路线图中列出的内容,对项目特别重要。

  • 对一元分布基础设施进行全面改进,以解决长期存在的问题(例如参见gh-15928)。

  • stats函数中一致处理nan_policyaxis参数和掩码数组(适当的情况下)。

支持更多的硬件平台

现在,SciPy 已经为 ARM64(或aarch64)和 POWER8/9(或ppc64le)进行了持续集成,并且可以通过Miniforge获得二进制文件。这些平台上的 PyPI 轮子现在也是可能的(符合manylinux2014标准),对这些轮子的请求也越来越多。

此外,现在可以在 TravisCI 上进行 IBM Z(或s390x)的持续集成,但尚未完成 - 并且那个平台上的manylinux2014轮子也可能。最后,解决 AIX 构建问题会帮助用户。

实现稀疏数组,除了稀疏矩阵外。

稀疏矩阵格式大部分功能已完善,但主要问题在于它们的行为类似于numpy.matrix(在某个时候将在 NumPy 中废弃)。我们希望的是稀疏数组,它们的行为类似于numpy.ndarray。这正在github.com/pydata/sparse上进行工作,已经相当成熟。初步计划是:

  • 一旦pydata/sparse功能完善(它仍然需要 CSC/CSR 等价物)并且性能足够好,就可以开始依赖它。

  • 在文档中指出,对于新代码,用户应优先考虑使用pydata/sparse而不是稀疏矩阵。

  • 当 NumPy 废弃numpy.matrix时,作为一个独立包进行维护或供应商化。

详细的 SciPy 路线图

原文链接:docs.scipy.org/doc/scipy-1.12.0/dev/roadmap-detailed.html

大多数路线图旨在提供关于 SciPy 各子模块在新功能、错误修复等方面最需要的高层次视图。除了重要的“业务常规”更改外,它还包含了一些主要新功能的想法 - 这些被标记为这样,并且预计需要显著的专注力量。在此路线图中未提到的事项未必不重要或超出范围,然而我们(SciPy 开发者)希望向用户和贡献者提供 SciPy 未来发展方向和最需要帮助的清晰图景。

这是详细的路线图。只包含最重要的想法的高级概述是 SciPy 路线图。

总体情况

这个路线图将与 SciPy 一起不断更新。更新可以通过提交拉取请求来完成。对于大型或颠覆性的更改,建议您首先在 scipy-dev 邮件列表上讨论。

API 变更

总体上,我们希望尽可能地演进 API 以消除已知的缺陷,尽可能不破坏向后兼容性

测试覆盖率

最近几年新增代码的测试覆盖率相当不错,我们目标是所有新增代码都具有高覆盖率。然而,仍有大量旧代码的覆盖率较低。将其提升到当前标准可能不现实,但我们应填补最大的漏洞。

除了覆盖率外,还存在正确性问题 - 较旧的代码可能有少量提供良好语句覆盖率的测试,但这并不一定意味着代码是否如箱子上所说的那样运行。因此,对代码的某些部分(特别是 statssignalndimage)进行代码审查是必要的。

文档

文档的形式良好。扩展当前的文档字符串 - 添加示例、引用和更好的解释 - 应该继续。大多数模块还在参考指南中有一个很好的入门教程,然而有几个缺失或不完整的教程 - 这些应该被修复。

性能基准

基于 asv 的基准测试系统已经相当完善。添加新的基准测试相当容易,但运行基准测试并不是非常直观。简化这一过程是一个优先事项。

使用 Cython

Cython 用于使用 NumPy 数组的旧语法应移除,并用 Cython 内存视图替换。当 Cython 3.0 发布时,最后使用过时的 NumPy C API 的部分(在 SciPy 中已修复)将消失。然后我们可以无条件地定义 NPY_NO_DEPRECATED_API

使用 Pythran

Pythran 仍然是可选的构建依赖项,并且可以通过 -Duse-pythran=false 来禁用。目标是将其变为强制性依赖项 - 为此必须清楚维护负担足够低。

使用古老的 Fortran 库

SciPy 的成功很大程度上归因于依赖于包装良好的 Fortran 库(QUADPACK、FITPACK、ODRPACK、ODEPACK 等)。其中一些库老化得很好,另一些则不然。我们应该审查我们对这些库的使用情况,考虑维护工作量、功能性以及(可能的部分)替代方案,包括 SciPy 内部的替代方案

持续集成

持续集成目前覆盖 32/64 位 Windows、macOS 上的 x86-64/arm、32/64 位 Linux 上的 x86 以及 Linux 上的 aarch64 - 以及我们依赖项的多个版本和构建发布质量的 wheel。最近(2023 上半年),由于支持的配置数量较多,某些 CI 任务需要进行大修,CI 的可靠性不佳。我们的目标是通过在删除 distutils 基础的工作时减少构建时间,并使 CI 任务集更正交来实现这一点。

二进制文件大小

SciPy 的二进制文件相当大(例如,未解压的 manylinux wheel 1.7.3 在 PyPI 上为 39 MB,安装后为 122 MB),这可能会带来问题 - 例如在 AWS Lambda 中使用,该服务有 250 MB 的大小限制。我们的目标是尽可能保持二进制大小的低廉;在添加新的编译扩展时,需要进行检查。在multibuild中去除调试符号可能可以改进(参见 此问题)。应该尽可能精简,并且不要添加新的大文件。在未来,正在考虑的可能有助于的事项包括分离打包的libopenblas和移除对long double的支持。

模块

群集

dendrogram 需要重写,有一些难以修复的问题和功能请求。

常量

这个模块基本完成,低维护且没有未解决的问题。

fft

这个模块状态良好。

积分

ODE 求解器需要:

  • 文档非常糟糕,需要修复

  • SciPy 1.0.0 中添加了新的 ODE 求解器接口(solve_ivp)。未来我们可以考虑(软)弃用旧 API。

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

插值

样条拟合:我们需要具有更好用户控制的样条拟合例程。这包括

  • 用户可选择的平滑标准替代方案(手动、交叉验证等);gh-16653 在这个方向上有了一些开端;
  • 几种节点放置策略,包括手动和自动(使用 Dierckx、de Boor 算法,可能还有其他算法)。

一旦我们有了功能齐全的集合,我们可以开始审视备受尊敬的 FITPACK Fortran 库的未来,该库目前是在 SciPy 中构建平滑样条的唯一方式。

张量积样条RegularGridInterpolator 提供了一个最小实现。我们希望在新功能(例如导数)、性能和 API 方面进一步发展,并可能提供一个透明的 N 维张量积 B 样条对象。

可扩展性和性能:对于基于 FITPACK 功能的数据,非 ILP64 构建的数据大小受 32 位 Fortran 整数大小的限制。对于 N-D 散点插值器(基于 QHull)和 N-D 规则网格插值器,我们需要检查大数据集的性能,并在性能不足时进行改进(gh-16483 在这方面取得了进展)。

新功能的想法:可以添加对 NURBS 的支持。

io

wavfile:

  • PCM 浮点将得到支持,其他情况请使用 audiolab 或其他专业库。

  • 如果数据不被理解,则抛出错误而不是警告。

其他子模块(matlab, netcdf, idl, harwell-boeing, arff, matrix market)状态良好。

linalg

scipy.linalg 状态良好。

需要:

  • 减少与 numpy.linalg 的函数重复,使 API 一致。

  • get_lapack_funcs 应始终使用 flapack

  • 包装更多 LAPACK 函数

  • LU 分解功能太多,移除一个

新功能的想法:

  • 在 Cython BLAS 和 LAPACK 中添加类型通用的包装器

  • 将许多线性代数例程转换为通用函数

BLAS 和 LAPACK

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

  1. 库支持。我们发布的轮子现在使用 OpenBLAS,这是目前唯一可行的高性能选项(ATLAS 太慢,MKL 由于许可问题不能成为默认选项,Accelerate 支持已经被移除,因为苹果不再更新 Accelerate)。然而,OpenBLAS 并不十分稳定,有时会因为发布而破坏功能,并且在线程处理方面存在问题(这是使用 PyPy3 时使用 SciPy 的唯一问题)。我们至少需要更好地支持调试 OpenBLAS 的问题,并提供如何用它构建 SciPy 的更好文档。一个选择是使用 BLIS 作为 BLAS 接口(参见 numpy gh-7372)。

  2. 支持更新的 LAPACK 功能。在 SciPy 1.2.0 中,我们将 LAPACK 的最低支持版本提高到了 3.4.0。现在我们已经放弃了 Python 2.7,我们可以进一步提高这个版本,并开始添加 LAPACK 中新功能的支持(之前 MKL 和 Python 2.7 是 >3.4.0 的障碍)。

misc

scipy.misc 将被移除作为一个公共模块。其中大部分功能已经被移到另一个子模块或已被弃用。仅剩下的几个功能:

  • derivativecentral_diff_weight:移除,可能用更全面的数值微分功能替换它们。

  • ascentfaceelectrocardiogram:移除或移动到适当的子包(如 scipy.ndimagescipy.signal)。

ndimage

ndimage底层是一个强大的插值引擎。用户期望两种模型之一:像素模型,其中(1, 1)元素的中心为(0.5, 0.5);或数据点模型,其中数值在网格上的点上定义。随着时间推移,我们逐渐确信数据点模型更清晰、更易实现,但这应清楚地在文档中进行说明。

更重要的是,SciPy 实现了数据点模型的一种变体,其中轴上任意两个极端处的数据点在周期包装模式下共享空间位置。例如,在 1D 数组中,x[0]x[-1]位置相同。然而,非常常见的用例是信号周期性,第一个和最后一个元素之间具有相等间距(而非零间距)。针对这种用例,添加了gh-8537中的包装模式,接下来应更新插值例程以使用这些模式。这应该解决几个问题,包括 gh-1323、gh-1903、gh-2045 和 gh-2640。

形态学接口需要标准化:

  • 二进制膨胀/腐蚀/开运算/闭运算需要“结构”参数,而它们的灰度等效操作需要尺寸(必须是元组,而非标量)、脚印或结构。

  • 尺寸应接受标量,等同于在每个轴上提供相同的值。

  • 对于二进制膨胀/腐蚀/开运算/闭运算,结构元素是可选的,而对于灰度操作则是强制性的。灰度形态学操作应采用相同的默认设置。

  • 其他滤波器也应在可能的情况下采用该默认值。

odr

该模块状态良好,尽管可能需要稍作维护。这里没有重大计划或愿望。

optimize

总体而言,该模块状况良好。在 1.2.0 中添加了两个优秀的全局优化器;大规模优化器仍有待填补空白。还需要其他几点:

  • linprog中的许多额外功能点子(例如整数约束),参见gh-9269

  • 添加功能到基准套件,以更轻松比较结果(例如通过汇总图表)。

  • 文档中弃用fmin_*函数,优先使用minimize

  • scipy.optimize具有广泛的全局优化器准确性和速度基准测试集。这使得我们可以添加新的优化器(如shgodual_annealing),其性能显著优于现有优化器。然而,optimize基准系统本身速度较慢且使用不便;我们需要使其更快,并通过绘制性能曲线更容易比较优化器的性能。

signal

卷积和相关性:(相关函数包括 convolve、correlate、fftconvolve、convolve2d、correlate2d 和 sepfir2d。)消除与ndimage(以及其他地方)的重叠。从numpyscipy.signalscipy.ndimage(以及其他任何找到的地方),选择 1-D、2-D 和 n-D 卷积和相关性的“最佳类”实现,将其放在某个位置并在整个 SciPy 中一致使用。

B 样条:(相关函数包括 bspline、cubic、quadratic、gauss_spline、cspline1d、qspline1d、cspline2d、qspline2d、cspline1d_eval 和 spline_filter。)将优秀的功能移至interpolate(并进行适当的 API 更改,以匹配interpolate中的操作方式),并消除任何重复。

滤波器设计:合并firwinfirwin2,以便移除firwin2

连续时间线性系统:移除lsim2impulse2step2lsimimpulsestep函数现在对任何输入系统“一键使用”。进一步提高ltisys的性能(减少不同表示之间的内部转换)。填补 lti 系统转换函数中的空白。

二阶段:使 SOS 滤波与现有方法同等能力。包括 ltisys 对象、lfiltic等效项以及与其他滤波器表示形式的数值稳定转换。对于其数值稳定性,可以将 SOS 滤波器视为 ltisys 对象的默认滤波方法。

小波:目前的内容不太合理。目前仅支持连续小波 - 决定是完全重写还是移除它们。离散小波变换超出范围(PyWavelets 在这方面做得很好)。

稀疏

稀疏矩阵格式基本上已经功能完备,但主要问题在于它们的行为类似于numpy.matrix(在某个时候将在 NumPy 中被弃用)。

我们想要的是行为类似于numpy.ndarray的稀疏数组。在 SciPy 1.8.0中,添加了一组新的类(如csr_array等) - 这些需要在实际应用中进行测试,还需要一些额外功能,如对 1-D 数组的支持。另一个更雄心勃勃的(目前尚不清楚是否会实现)计划正在github.com/pydata/sparse上进行。

  • 一旦pydata/sparse功能完备(仍需 CSC/CSR 等效),并且在性能上达到要求,开始依赖它。

  • scipy.sparse.linalg添加对pydata/sparse的支持(之后可能还会添加到scipy.sparse.csgraph)。

  • 在文档中指出,对于新代码,用户应优先选择pydata/sparse而不是稀疏矩阵。

  • 当 NumPy 弃用numpy.matrix时,供应商化或将其作为独立包维护。

关于不同的稀疏矩阵格式:有很多种。这些应该保留,但是应该对 CSR/CSC 进行改进/优化,这是首选格式。LIL 可能是个例外,它本质上效率低下。如果 DOK 被扩展以支持 LIL 目前提供的所有操作,则可以放弃 LIL。

sparse.csgraph

这个模块状况良好。

sparse.linalg

_arpacklobpcg 存在大量的未解决问题。_propack 在 1.8.0 版中是新功能,目前还不清楚其稳定性如何。

_isolve:

  • callback 关键字不一致

  • tol 关键字有问题,应该是相对容差

  • Fortran 代码不可重入(但我们不解决,也许可以从 PyKrilov 重用)

_dsolve:

  • 添加符合许可证的稀疏 Cholesky 或不完全 Cholesky

  • 添加符合许可证的稀疏 QR

  • 改进与 SuiteSparse UMFPACK 的接口

  • 添加与 SuiteSparse CHOLMOD 和 SPQR 的接口

空间

QHull 包装器状态良好,以及 KDTree

在 C++ 中重写 spatial.distance 度量标准 - 这应该提高性能,使行为更一致(例如对各种非 float64 输入 dtype),并解决数个度量标准的数学定义中仍然存在的一些问题。

特殊

尽管有许多需要提高精度的函数,可能唯一的阻碍因素是超几何函数、抛物线柱函数和球面波函数。处理这个问题的三种可能方式:

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

  2. 将 Boost 的任意精度库移植并在底层使用以获得双精度精度。这可能是超几何函数的临时解决措施;之前 @nmayorov 和 gh-5349 中也提到过使用任意精度的想法。对于球面波函数可能是必要的,这可以重复使用:github.com/radelman/scattering

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

统计

scipy.stats 子包旨在提供基础统计方法,这些方法可能在标准统计教材中涵盖,例如 Johnson 的 “Miller & Freund's Probability and Statistics for Engineers”,Sokal & Rohlf 的 “Biometry”,或 Zar 的 “Biostatistical Analysis”。它不旨在复制下游包(例如 StatsModels、LinearModels、PyMC3)的高级功能;相反,它可以为它们构建提供坚实的基础。(请注意,这些是粗略的指导方针,而非严格规则。“高级”是一个模糊且主观的术语,“高级”方法可能也包含在 SciPy 中,特别是如果没有其他广泛使用且得到良好支持的包覆盖该主题。此外,请注意 某些 与下游项目的重复是不可避免的,而且未必是一件坏事。)

除了 SciPy Roadmap 中描述的项目外,以下改进将有助于 SciPy 更好地发挥其作用。

  • 添加基础和广泛使用的假设检验,例如:

    • 后续检验(例如 Dunnett 的检验)

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

      • 双因素方差分析(单次重复,统一次数重复,可变次数重复)

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

      • 嵌套方差分析

      • 协方差分析(ANCOVA)

    另外,为实施假设检验提供基础设施。

  • 为荟萃分析添加额外工具

  • 添加生存分析工具

  • 加快分布的随机变量抽样(方法 rvs),利用适当的 scipy.stats.sampling

  • 扩展 QMC 的功能和性能

  • 加强连续概率分布的 fit 方法:

    • 扩展拟合选项以包括:

      • 最大乘积间距

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

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

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

  • 实现额外广泛使用的连续和离散概率分布,例如混合分布。

  • 改进 SciPy 提供的核心计算,使其能够稳健地处理广泛范围的参数值。具体而言,将许多来自 Fortran 库 CDFLIB 的 PDF 和 CDF 方法替换为 Boost 实现,如 gh-13328 中所示。

此外,我们应该:

  • 继续努力使 statsstats.mstats 的函数签名更加一致,并添加测试以确保保持一致性。

  • 改进统计检验:返回检验统计量的置信区间,并在计算可行时实现精确的 p 值计算 - 考虑可能的并列情况。

工具链路线图

原文:docs.scipy.org/doc/scipy-1.12.0/dev/toolchain.html

使用 SciPy 库需要(或者可选择依赖于)其他几个库才能正常运行,主要依赖是 Python 和 NumPy。构建该库或构建文档需要更多的库和工具。

当然,工具和库本身并非静态。本文档旨在指导 SciPy 如何随时间推移使用这些动态依赖项。

SciPy 旨在与其依赖库和工具的多个版本兼容。强迫用户基础为每个发布升级到其他组件会大大降低 SciPy 的价值。然而,与非常旧的工具/库保持向后兼容会限制能够整合的新功能和能力。SciPy 采取了一种相对保守的方法,在主要平台上与 Python 和 NumPy 的几个主要发布兼容。(这本身可能会进一步限制。请参见 C 编译器部分的示例。)

  • 首先,SciPy 是一个 Python 项目,因此需要 Python 环境。

  • BLAS 和 LAPACK 数值库需要安装。

  • 需要 C、C++、Fortran 代码的编译器,以及 Cython 和 Pythran(后者目前是选择性的退出)

  • Python 环境需要安装NumPy包。

  • 测试需要pytesthypothesisPython 包。

  • 构建文档需要matplotlib、Sphinx 和MyST-NB包以及 PyData 主题。

用于构建 CPython 的工具对构建 SciPy 的工具有一些影响。它还影响文档中使用的示例(例如,函数的文档字符串),因为这些示例只能使用所有支持的配置中存在的功能。

构建 SciPy

Python 版本

SciPy 兼容多个版本的 Python。在放弃对较旧 Python 版本的支持时,SciPy 遵循 NEP 29 [1]的指导。从 SciPy 1.3 开始,不再支持 Python 2.7。

日期 支持的 Python 版本
2018 Py2.7, Py3.4+(SciPy 1.2.x 是最后一个支持 Python 2.7 的发布版本)
2019 Py3.5+(但未移除 Py2.7 特定代码)
2020 Py3.6+(允许移除 Py2.7 特定代码)
2021 Py3.7+
2022 Py3.8+

NumPy

SciPy 依赖于 NumPy,但 SciPy 的发布与 NumPy 的发布没有直接关系。SciPy 尝试与至少前 4 个 NumPy 版本兼容。特别地,SciPy 不能仅仅依赖最新的 NumPy 功能,而是需要使用这 4 个版本中通用的功能来编写[2]

该表显示了适用于每个主要 Python 版本的 NumPy 版本。

SciPy 版本 Python 版本 NumPy 版本
1.2 2.7, >=3.4, <=3.7 >=1.8.2, <= 1.16.x
1.4 >=3.5, <=3.8 >=1.13.3, <= 1.17.3
1.5 >=3.6, <=3.9 >=1.14.5, <= 1.19.3
1.6 >=3.7, <=3.9 >=1.16.5, <= 1.20.x
1.7.0/1 >=3.7, ❤️.10 >=1.16.5, <1.23.0
1.7.2/3 >=3.7, ❤️.11 >=1.16.5, <1.23.0
1.8 >=3.8, ❤️.11 >=1.17.3, <1.24.0
1.9.0/1 >=3.8, ❤️.12 >=1.18.5, <1.25.0
1.9.2 >=3.8, ❤️.12 >=1.18.5, <1.26.0
1.10 >=3.8, ❤️.12 >=1.19.5, <1.26.0
1.11 >=3.9, ❤️.12 >=1.21.6, <1.27.0
1.12 >=3.9, ❤️.13 >=1.22.4, <2.0.0

在特定情况下,例如特定架构,这些要求可能会有所不同。请查看发布说明[3]和元包oldest-supported-numpy以获取更多信息[4]

编译器

构建 SciPy 需要 C、C++、Fortran 编译器以及 Python 转译器 Cython 和 Pythran(后者是从版本 1.7.0 开始的可选依赖项)。

为了保持与大量平台和设置的兼容性,特别是在无法使用官方 wheels(或其他分发渠道如 Anaconda 或 conda-forge)的情况下,SciPy 试图保持与旧编译器的兼容性,尚未达到官方生命周期结束的平台。

如下所述,当前的最小编译器版本为:

Compiler 默认平台(已测试) 次要平台(未测试) 最小版本
GCC Linux AIX、Alpine Linux、OSX GCC 8.x
LLVM OSX Linux, FreeBSD, Windows LLVM 10.x
MSVC Windows Visual Studio 2019 (vc142)

请注意,LLVM 的下限并未强制执行。较旧版本应该可以工作 - 只要它们支持核心(非标准库)C++17 - 但在开发过程中没有测试 LLVM 12 以下的任何版本。如果在编译过程中遇到问题,请提交问题报告。

官方构建

目前,SciPy 的 wheel 构建如下:

平台 CI 基础镜像[5] [6] [7] 编译器 备注
Linux x86 ubuntu-22.04 GCC 10.2.1 cibuildwheel
Linux arm docker-builder-arm64 GCC 11.3.0 cibuildwheel
OSX x86 macOS-11 clang-13/gfortran 11.3.0 cibuildwheel
OSX arm macos-monterey-xcode:14 clang-13.1.6/gfortran 12.1.0 cibuildwheel
Windows windows-2019 GCC 10.3(rtools) cibuildwheel

注意在 OSX 上,额外提供了 gfortran 11.3.0 用于 x86_64,以及 gfortran 12.1.0 用于 arm64。请参见tools/wheels/cibw_before_build_macos.sh

C 编译器

SciPy 兼容大多数现代 C 编译器(特别是clang)。如今,所有相关编译器对最近的 C 语言标准都有合理的支持,尽管这与以往截然不同。以下段落主要讨论这些限制的演变;不关心历史背景的读者可以直接跳到末尾的表格。

在过去,相关平台上最具限制性的 C 支持编译器是微软 Visual C++编译器及工具集(合称 MSVC)[8] [9]。直到 Visual Studio 2013,每个 MSVC 版本都附带一个更新的 C Runtime(CRT)库,与之前的版本不兼容。

应用程序二进制接口(ABI)的不兼容性意味着所有希望通过此接口进行通信(例如调用共享库中的函数)的项目都需要使用相同的 MSVC 版本进行(重新)编译。CPython 2.7 的长期支持意味着 Python 本身长时间以来一直使用 VS 2008(为了在补丁发布中不破坏 ABI),因此 SciPy 也一直停留在那个版本。

使用 VS 2008(不支持 C99)为 CPython 2.7 编译构建版本,长时间以来意味着 SciPy 中的 C 代码必须符合早期的 C90 语言和标准库标准。在 SciPy 1.3.x 中放弃对 CPython 2.7 的支持后,这一限制终于被解除(尽管一开始只是逐步解除)。

自从发布 Visual Studio 2015 以来,引入了“Universal C Runtime”(UCRT)[10],C Runtime 的 ABI 已经稳定,这意味着不再需要在 SciPy 中使用与底层 CPython 版本相同的编译器版本的限制。然而,这种稳定性并非永久性:微软一直在计划[11]发布破坏 ABI 的版本 - 跨编译器和 C/C++标准库 - (暂时称为“vNext”),但目前尚不清楚具体时间。一旦这种情况发生,SciPy 将再次受到最多与最新 ABI 兼容的 Visual Studio 版本的限制(目前为 VS 2022),直到根据 NEP29 支持的所有 CPython 版本都使用了与 vNext 兼容的编译器为止。

具体而言,微软 Visual Studio 版本与目标“工具集”的版本之间有区别,工具集被定义为“Microsoft C++编译器、链接器、标准库及相关工具”。每个 Visual Studio 版本都附带一个默认的 MSVC 工具集版本(例如 VS2017 带有 vc141,VS2019 带有 vc142),但在较新版本的 Visual Studio 中也可以针对旧的工具集进行目标设置。由于编译器的性质(即前端和后端分离),支持给定特性(例如在 C 中)的限制因素是 Visual Studio 版本还是工具集,这取决于具体情况,但总体而言,后者是一个更难以突破的障碍,因此是实际的下限。

这是因为尽管工具集版本之间的 ABI 保持兼容(直到 vNext),但所有链接操作必须使用至少与用于构建任何涉及工件的工具集一样新的工具集,这意味着工具集版本提升往往会是“传染性的”,即需要所有消费库也提升其工具集(和可能的编译器)版本。这对 NumPy 而言比 SciPy 更为严重,因为后者只有一个较小的 C API,并且与比较少的项目编译。此外,使用更新的工具集意味着编译 C++ 代码的库的用户(如 SciPy 所做的那样)可能还需要更新的 Microsoft Visual C++ Redistributable,这可能需要分发给他们[13]

综上所述,对于每个 SciPy 版本,MSVC 编译器或工具集的最低要求主要由当时支持的最旧 CPython 版本决定。首个将最低要求提升至此的 SciPy 版本是 1.9,原因是包含了不支持 vc141 编译的 HiGHS 子模块,以及在公共 CI 中积极删除 VS2017,使得确保所有工具集版本能够与非默认工具集版本一起使用变得不可行。

SciPy 版本 CPython 支持 MS Visual C++ 工具集版本
Until 1.2 2.7 & 3.4+ VS 2008 (9.0) vc90
1.3, 1.4 3.5+ VS 2010 (10.0) vc100
1.5 3.6+ VS 2015 (14.0) vc140
1.6, 1.7 3.7+ VS 2017 (14.1) vc141
1.8 3.8+ VS 2017 (14.1) vc141
1.9 3.8+ VS 2019 (14.20) vc142

就 C 语言标准而言,值得注意的是 C11 具有可选特性 [14](例如原子操作、线程),其中一些(如 VLAs 和复杂类型)在 C99 标准中是强制性的。C17(有时称为 C18)可以视为对 C11 的错误修正,因此通常可以跳过 C11。

SciPy 受可用编译器支持的先进语言特性限制,尤其是微软公司花费了很长时间才达到对 C99/C11/C17 的一致性,然而从 MS Visual Studio 16.8 开始,已支持 C11/C17 [15](尽管没有 C11 可选特性)。对于 SciPy 而言,C99 <complex.h> 特别有趣;MSVC 对此和 <stdatomic.h> 的一致性正在这里追踪 [16] [17]。然而,仍然可以在 Windows 上使用复杂类型,只要使用特定于 Windows 的类型即可[18]

因此,只有在 Windows 上得到支持时才能使用超出 C90 的 C 特性;然而,截至 2021 年底,使用了足够新的编译器。这是因为 GCC 和 LLVM 在其当前使用的最旧版本上支持所有相关的 C11 特性,而 C17 只是对 C11 的错误修正,如前所述。简而言之:

日期 C 标准
<= 2018 C90
2019 对于旧代码采用 C90,可能考虑对新代码采用 C99
2020 C99(无 <complex.h>, <stdatomic.h>, <threads.h> 和 VLAs)
2021 C17(无 <complex.h>, <stdatomic.h>, <threads.h> 和 VLAs)
? C23、<complex.h><stdatomic.h>、…

C++ 语言标准

对于 SciPy 来说,C++语言标准通常是指导方针,而非官方决策。这一点尤其适用于尝试预测新标准采用时间表。

Date C++ 标准
<= 2019 C++03
2020 C++11
2021 C++14
2022 C++17(核心语言 + 通用库特性)
? C++17(具备完整的标准库)、C++20、C++23

放弃对 Python 2.7 的支持后,可以普遍使用 C++11,并且在放弃对 Python 3.6 后,Visual Studio 版本(由于与 CPython 的 ABI 兼容性而曾被限制在 14.0 版本)已足够新,甚至支持 C++17。

由于官方构建(详见上文)使用了相当新的 LLVM 版本,因此 C++ 支持的瓶颈是最旧支持的 GCC 版本,而 SciPy 主要受到最旧支持的 manylinux 版本和镜像中的版本的限制 [19]

在 2021 年底(最终移除 manylinux1 wheels),GCC 的最低要求移至 6.3 版本,该版本具备完整的 C++14 支持 [20]。这对应于相关 manylinux 版本中存在的最低 GCC 版本,尽管与以前基于 RHEL 衍生的 CentOS 的 manylinux 镜像不同,后者可以从 “RHEL Dev Toolset” 中获益,支持兼容 ABI 的 GCC 后移版本,但 manylinux_2_24 却停留在 GCC 6.3 版本。由于这些过时的编译器,该镜像未能成功 [21],并在 2022 年中旬到达其生命周期结束 [22]。出于不同原因,manylinux2010 也在同一时期达到了其生命周期结束 [23]

现有的 manylinux2014manylinux_2_28 镜像目前分别支持 GCC 10 和 11。后者将在新的 GCC 版本推出时继续更新为后移版本,但前者可能不会改变,因为 CentOS 项目已不再响应发布 GCC 11 的 aarch64 后移版本 [24]

这使得所有主要平台及其编译器都具备相对较新的版本。然而,SciPy 在历史上也努力支持不太常见的平台,即使不能提供二进制构件(即 wheels),也能通过源码编译支持 - 这包括例如 AIX、Alpine Linux 和 FreeBSD。

对于 AIX 7.1 和 7.2,默认编译器是 GCC 8(AIX 6.1 在 2017 年已经到达生命周期结束),但可以安装(并行使用)GCC 10 [25]。当前支持的最旧 Alpine Linux 发行版是 3.12 [26],已经带有 GCC 10。对于 FreeBSD,当前支持的最旧 12.x 版本 [27] 配备了 LLVM 10(并且 GCC 10 可以作为 freebsd-port 安装 [28])。

最后,还有一个问题,即哪些机器被广泛用于需要编译 SciPy 源代码的人(例如 SciPy 开发人员,或因性能原因想自行编译的人)。最旧的相关发行版(不带有 RHEL 风格的后端支持)是 Ubuntu 18.04 LTS(带有 GCC 7 但也有 GCC 8 的后端支持;Ubuntu 20.04 LTS 带有 GCC 9)和 Debian Buster(带有 GCC 8;Bullseye 带有 GCC 10)。这是确定编译器支持下限的最弱限制(可以预期,电脑高手和开发人员会保持系统至少有些更新,或者使用可用的后端支持),随着老旧发行版的使用量逐渐减少,这种限制逐渐变得不那么重要。

所有当前支持的最低版本的编译器(GCC 8,LLVM 12,VS2019 with vc142)均完全支持 C++17 核心语言,因此可以无条件使用。然而,截至 2022 年中,尚未在所有编译器中完成对 C++17 标准库的完整支持 [20],特别是 LLVM。因此,在将其用于 SciPy 之前,需要检查所有编译器是否支持特定的 stdlib 特性。对于 C++20 和 C++23,编译器的支持仍在积极开发中 [20]

Fortran 编译器

通常情况下,任何维护良好的编译器都可能适用并可用于构建 SciPy。

工具 版本
gfortran >= 4.8.0
ifort 最近版本
flang 最近版本

Cython & Pythran

SciPy 总是需要一个最新的 Cython 编译器。自 1.7 版本开始,Pythran 是一个构建依赖项(目前可以选择不使用)。

OpenMP 支持

出于各种原因 [29],SciPy 不能带有内置的 OpenMP 支持。在使用可选的 Pythran 支持时,可以在构建源码时生成支持 OpenMP 的并行代码。

其他库

任何符合 BLAS/LAPACK 接口的库均可使用。已知可用的有 OpenBLAS、ATLAS、MKL、BLIS 和参考 Netlib 库。

最低版本
LAPACK 3.7.1
BLAS OpenBLAS、MKL 或 ATLAS 的最新版本。不再支持 Accelerate BLAS 库。

还有一些额外的可选依赖项。

版本 网址
mpmath 最近版本 mpmath.org/
scikit-umfpack 最近版本 pypi.org/project/scikit-umfpack/
pooch 最近版本 pypi.org/project/pooch/

此外,SciPy 还支持与其他库的交互。测试套件在安装这些库时运行了额外的兼容性测试:

工具 版本 网址
pydata/sparse 最近版本 github.com/pydata/sparse/

测试与基准测试

测试与基准测试需要使用最新版本的:

工具 版本 网址
pytest 最新版本 docs.pytest.org/en/latest/
Hypothesis 最新版本 hypothesis.readthedocs.io/
asv (airspeed velocity) 最新版本 asv.readthedocs.io/

构建文档

工具 版本
Sphinx 最新版本即可,要求 >= 2.0.
PyData Sphinx 主题 最新版本即可,要求 >= 0.8.1。
Sphinx-Design 最新版本即可,要求 >= 0.2.0。
numpydoc 最新版本即可,要求 >= 0.8.0。
matplotlib 通常建议 >= 2.0。
MyST-NB 最新版本即可,要求 >= 0.17.1

注意

开发者注意事项:所需的numpymatplotlib版本对 Python 文档字符串中的示例有影响。示例必须能够在用于构建文档的环境中执行,也必须能够与用户可能在此版本的 SciPy 中使用的任何支持的numpy/matplotlib版本一起执行。

打包

最近版本的:

工具 版本 URL
setuptools 最新版本 pypi.org/project/setuptools/
wheel 最新版本即可 pythonwheels.com
multibuild 最新版本 github.com/matthew-brett/multibuild

制作 SciPy 发行版 和 分发 包含有关制作和分发 SciPy 发行版的信息。

参考资料

SCIPY 组织

SciPy 核心开发者指南

原文链接:docs.scipy.org/doc/scipy-1.12.0/dev/core-dev/index.html

决策过程

SciPy 有一个正式的治理模型,详见 SciPy 项目治理。以下部分以非正式方式记录了关于代码和提交权限决策的实际情况。正式的治理模型为主导,以下内容仅供参考。

代码

对于添加(或不添加)新功能、破坏向后兼容性或对代码库进行其他重大更改的任何重大决策,应在 scipy-dev 邮件列表上进行讨论(最好达成全体一致)。

任何非微不足道的更改(微不足道指拼写错误或一行维护提交)都必须通过拉取请求(PR)进行。它必须由另一名开发者审查。如果审查不及时发生,并且重要的是快速合并 PR,提交者应该向邮件列表发送消息,表示他/她打算在时间 X 之前合并该 PR,理由是 Y,除非有人在那之前审查它。

更改和新添加应该进行测试。未经测试的代码是有问题的代码。

提交权限

谁拥有提交权限由 SciPy 指导委员会决定;提交权限的更改将在 scipy-dev 邮件列表上宣布。

决定新增功能

迄今为止,接受建议的新功能的一般决策规则一直是有条件的:

  1. 这种方法在许多领域都适用,并且“普遍认为”是有用的,

  2. 它适合于子模块的主题,且不需要大量支持框架来运行,

  3. 实现看起来很合理,并且未来不太可能需要太多调整(例如,预期的维护负担有限),

  4. 有人希望贡献它,以及

  5. 有人希望审查它。

最后的标准通常是建议功能的一个槽点。在代码经过彻底审查之前,代码是不能合并的,而且总是有维护任务积压,竞争审阅者的时间。理想情况下,贡献者在开始工作之前应该找到一个具有适当领域专业知识的审阅者。

虽然很难对“普遍有用和普遍认为有效”给出明确的规则,但可以将以下因素相互对比:

  • 这种方法在实践中在不同领域中使用/有用吗?使用它需要多少领域特定的背景知识?

  • 考虑已经在模块中的代码。你所添加的是一种遗漏吗?它解决了你期望模块能够解决的问题吗?它是否以显著方式补充了现有功能?

  • 考虑通常预期的类似方法/功能的等价类。其中,原则上哪些是最小集合,以便所提供的功能中没有明显遗漏?那会是多少东西?包括代表性的一个是否涵盖了大多数用例?原则上,将最小集合中的所有内容都包括在模块中是否合理?

  • 您正在添加的内容是否在文献中有很好的理解?如果不是,您对它能够成功的信心有多大?该方法与其他类似方法相比表现如何?

  • 请注意,每年两次的发布周期和向后兼容性政策使得稍后纠正事物变得更加困难。

子模块的范围也有所不同,因此最好将每个子模块视为单独的项目 - “特殊函数的数值评估”相对而言定义较好,但“常用的优化算法”则较少定义。

在 GitHub 上开发

SciPy 的开发主要在 GitHub 上进行;本节描述了处理问题、拉取请求和管理主要scipy存储库的预期工作方式。

标签和里程碑

每个问题和拉取请求通常至少会获得两个标签:一个用于主题或组件(scipy.statsDocumentation等),另一个用于问题或拉取请求的性质(enhancementmaintenancedefect等)。根据情况可能添加其他标签:

  • easy-fix:适合新贡献者解决的问题。

  • needs-work:具有未解决审查评论的拉取请求。

  • needs-decision:需要决策的问题或拉取请求。

  • needs-champion:适用于原始作者未完成但值得恢复的拉取请求。

  • backport-candidate:应由发布经理考虑将其回溯修复的 bug 修复。

为计划发布的每个版本号创建一个里程碑。需要为特定版本解决的问题和需要合并的拉取请求应设置为相应的里程碑。在合并拉取请求后,其里程碑(以及关闭的问题的里程碑)应设置为即将到来的下一个版本 - 这样可以轻松查看更改的概述,并将其完整列表添加到发布说明中。

拉取请求审查工作流程

在审查拉取请求时,请利用拉取请求工作流程功能,参见使用工作流程功能。

处理拉取请求

  • 当合并贡献时,提交者负责确保这些贡献符合贡献 SciPy中概述的要求。还要检查新功能和向后兼容性破坏是否在 scipy-dev 邮件列表上进行了讨论。

  • 新代码通过拉取请求(PR)进入。

  • 使用绿色按钮合并新代码。如果出现合并冲突,请要求 PR 提交者进行变基(可能需要提供一些 git 指令)。

  • 回溯和微不足道的添加以完成 PR(确实微不足道,比如拼写错误或 PEP8 修复)可以直接推送。

  • 对于添加新功能或以某种方式复杂的 PR,请至少等待一两天再合并。这样,其他人有机会在代码进入之前进行评论。

  • 挤压提交或清理您认为太混乱的 PR 提交消息是可以的。但在此过程中,请务必保留原作者的姓名。

  • 确保合并的 PR 上的标签和里程碑设置正确。

  • 当您想要拒绝一个 PR 时:如果非常明显,您可以直接关闭并解释原因;如果不明显,则最好首先解释为什么您认为 PR 不适合包含在 SciPy 中,然后让第二个合作者进行评论或关闭。

回溯

所有的 PR(无论是增强、错误修复还是其他内容)都应该提交到主分支。只有错误修复才有资格回溯到维护分支。SciPy 的回溯策略是:(a)只回溯重要的修复;(b)只有在合理确定相关维护分支上会发布新的 bug 修复版本时才回溯。通常,合并重要 bug 修复的开发人员会添加backport-candidate标签并联系发布经理,后者决定是否以及何时进行回溯。回溯完成后,必须再次删除backport-candidate标签。

回溯 PR 的一个好策略是将几个主分支的 PR 合并在一起,以减少持续集成测试的负担并减少维护分支历史记录中的合并提交混乱。通常最好为回溯 PR 中代表的每个主分支 PR 保留一个提交。这样,历史记录清晰,并且如果需要的话可以直接撤销。

发布说明

当 PR 合并时,请考虑是否需要在发布说明中提及更改内容。需要提及的内容包括:新功能、不向后兼容的更改、弃用以及“其他更改”(任何其他值得注意的内容,请参阅较早的发布说明,了解值得提及的内容种类)。

发布说明条目在 wiki 上维护(例如github.com/scipy/scipy/wiki/Release-note-entries-for-SciPy-1.2.0)。发布经理将从那里收集内容,并将其整合到 html 文档中。我们使用这种机制来避免每个 PR 直接触及doc/release/下同一文件时可能发生的合并冲突。

更改可以通过Atom feed进行监控,并进行拉取(wiki 是一个 git 仓库:https://github.com/scipy/scipy.wiki.git)。

其他

PR 状态页面: 当向拉取请求添加新提交时,GitHub 不会发送任何通知。然而,needs-work标签可能已不再适用。此页面提供了更新的 PR、需要审查、需要决策等概述。

交叉引用: 在 GitHub 上交叉引用问题和拉取请求通常很有用。GitHub 允许使用gh-xxxx#xxxx来进行引用,其中xxxx是问题/PR 编号。强烈推荐使用gh-xxxx格式,因为清楚表明这是一个 GitHub 链接。旧问题包含 Trac(我们在 GitHub 之前使用的系统)票据的#xxxx

PR 命名约定: 拉取请求、问题和提交消息通常以ENH:BUG:等三个字母缩写开头。这对于快速了解提交/PR/问题的性质非常有用。有关缩写的完整列表,请参见编写提交消息

许可证

SciPy 采用修改后的BSD 许可证(3 条款)进行分发。所有由贡献者添加到 SciPy 的代码、文档和其他文件均根据此许可证授权,除非源代码明确指定了另一许可证。贡献者保留他们编写并提交到 SciPy 的代码的版权。

其他与 SciPy 使用的修改后 BSD 许可证兼容的许可证包括 2 条款 BSD、MIT 和 PSF。不兼容的许可证包括 GPL、Apache 以及要求归属/引用或禁止商业用途的自定义许可证。

PR 通常包含从未经许可的代码或来自不兼容 SciPy 许可证的默认许可的代码或其派生的内容。例如,在 StackOverflow 上发布的代码受 CC-BY-SA 许可证保护,由于共享条款的存在,这些贡献无法被纳入 SciPy。除非原始代码的作者愿意根据修改后的 BSD(或兼容的)许可证重新许可其代码,否则这些贡献将无法被接受。如果原始作者同意,请在源文件中添加一条注释以此说明,并将相关通信转发给 scipy-dev 邮件列表。

另一种常见情况是代码是从 R、Octave(都是 GPL 许可)或商业应用程序的代码翻译或派生而来。此类代码也无法包含在 SciPy 中。但是,只要作者没有查看不兼容许可源代码的原始实现,通过相同 API 实现功能是可以的。## 版本编号

SciPy 版本编号遵循PEP 440。发布的最终版本(这些版本是唯一出现在PyPI上的版本)编号为MAJOR.MINOR.MICRO,其中:

  • MAJOR是一个整数,表示主要版本。它很少更改;MAJOR的变化表示大(可能不兼容)的更改。

  • MINOR是一个整数,表示次要版本。次要版本通常每年发布两次,可能包含新功能、弃用和错误修复。

  • MICRO是一个整数,表示错误修复版本。错误修复版本在需要时发布,通常每个次要版本一到两个版本。它们不能包含新功能或弃用。

发布的 alpha、beta 和 rc(发行候选)版本编号与最终版本相同,但分别带有后缀a#b#rc##为整数。开发版本带有后缀.dev0+<git-commit-hash>

有效的 SciPy 版本字符串示例:

0.16.0
0.15.1
0.14.0a1
0.14.0b2
0.14.0rc1
0.17.0.dev0+ac53f09 

安装的 SciPy 版本包含这些版本标识符:

scipy.__version__            # complete version string, including git commit hash for dev versions
scipy.version.short_version  # string, only major.minor.micro
scipy.version.version        # string, same as scipy.__version__
scipy.version.full_version   # string, same as scipy.__version__
scipy.version.release        # bool, development or (alpha/beta/rc/final) released version
scipy.version.git_revision   # string, git commit hash from which scipy was built 
```## 弃用

有各种各样的原因希望删除现有功能:它有 bug,API 难以理解,它被性能更好的功能所取代,它需要移动到另一个 SciPy 子模块等等。

通常不建议在未事先警告用户的情况下删除某些内容。因此,在从公共 API 中删除某些内容之前,应执行以下操作:

1.  建议在 scipy-dev 邮件列表上提议弃用该功能,并获得同意认为这样做是可以接受的。

1.  为此添加一个`DeprecationWarning`,指出该功能已被弃用,并指明是在哪个版本中。对于 Cython API,请参阅 Deprecating public Cython APIs 获取实际步骤。

1.  在该版本的发布说明中提及该弃用。

1.  在引入`DeprecationWarning`的发布日期后至少等待 6 个月,然后再删除该功能。

1.  在发布说明中提及该功能的移除。

实际上,6 个月的等待期通常意味着等待两个版本。在引入警告时,还要确保在运行测试套件时过滤掉这些警告,以免污染输出。

可能有理由希望忽略某个特定弃用策略:这总是可以在 scipy-dev 邮件列表上讨论的。## 分发

分发 Python 包是一个非常棘手的问题 - 特别是对于像 SciPy 这样具有复杂构建要求的包 - 并且可能会发生变化。有关推荐工具和技术的最新概述,请参阅[Python Packaging User Guide](https://packaging.python.org)。本文档讨论了 SciPy 的一些主要问题和考虑事项。

### 依赖项

依赖项是用户必须安装的东西,以便使用(或构建/测试)一个包。它们通常会带来麻烦,特别是如果它们是必需的。SciPy 试图将其依赖项保持在最低限度;目前它们包括:

*无条件运行时依赖:*

+   [NumPy](https://numpy.org)

*条件运行时依赖:*

+   pytest(用于运行测试套件)

+   [asv](https://asv.readthedocs.org)(用于运行基准测试)

+   [matplotlib](https://matplotlib.org)(用于一些可以生成图形的函数)

+   [pooch](https://www.fatiando.org/pooch/latest/)(用于 scipy.datasets 模块)

+   [Pillow](https://pillow.readthedocs.org)(用于图像加载/保存)

+   [scikits.umfpack](https://pypi.org/project/scikit-umfpack)(在`sparse.linalg`中可选使用)

+   [mpmath](http://mpmath.org)(用于`special`中更多的扩展测试)

+   pydata/sparse(在`scipy.sparse`中的兼容性支持)

+   [threadpoolctl](https://github.com/joblib/threadpoolctl)(用于控制测试套件中的 BLAS/LAPACK 线程)

+   [Hypothesis](https://hypothesis.readthedocs.io/en/latest/index.html)(用于运行特定的单元测试)

*无条件的构建时依赖:*

+   [Numpy](https://numpy.org)

+   BLAS 和 LAPACK 实现(参考 BLAS/LAPACK,ATLAS,OpenBLAS,MKL 都已知可用)

+   [Cython](https://cython.org)

+   [setuptools](https://github.com/pypa/setuptools)

+   [pybind11](https://github.com/pybind/pybind11)

*有条件的构建时依赖:*

+   [wheel](https://wheel.readthedocs.io/)(`python setup.py bdist_wheel`)

+   [Sphinx](http://www.sphinx-doc.org/)(文档)

+   [PyData Sphinx 主题](https://pydata-sphinx-theme.readthedocs.io/en/latest/)(文档)

+   [Sphinx-Design](https://sphinx-design.readthedocs.io)(文档)

+   [matplotlib](https://matplotlib.org)(文档)

+   [MyST-NB](https://myst-nb.readthedocs.io/)(文档)

当然,构建 SciPy 还需要 C、C++和 Fortran 编译器,但我们不认为这些是依赖关系,因此这里不讨论它们。详情请参见[`scipy.github.io/devdocs/dev/contributor/building.html`](https://scipy.github.io/devdocs/dev/contributor/building.html)。

当一个软件包提供了有用的功能并且被提议作为一个新的依赖时,考虑是否有必要代理(即与 scipy 一起提供该软件包的副本)。例如,[decorator](https://github.com/micheles/decorator) 在 `scipy._lib` 中被代理。

唯一报告给[pip](https://pip.pypa.io/en/stable/)的依赖是[Numpy](https://numpy.org),请参阅 SciPy 主要的`setup.py`中的`install_requires`。其他依赖项对于 SciPy 的正确功能并不需要。

#### 依赖处理的问题

Python 打包工具如何处理项目报告的依赖关系存在一些问题。由于 SciPy 定期收到此类错误报告,我们在这里稍作详细说明。

如果系统上完全未安装 NumPy,或者在使用 `bdist_wheel` 构建 wheels 时,SciPy 仅通过 `install_requires` 报告其对 NumPy 的依赖。SciPy 不再使用 `setup_requires`(过去调用 `easy_install`),构建依赖项现在仅通过 `pyproject.toml` 处理。`pyproject.toml` 遵循 PEP 517;`pip` 提供了 `--no-use-pep517` 和 `--no-build-isolation` 标志,可能会忽略或以不同方式处理 `pyproject.toml` - 如果用户使用这些标志,则需要自行安装正确的构建依赖项。

#### NumPy 和其他依赖项的版本范围

对于依赖项,设置它们版本的下限和上限非常重要。对于*构建时*依赖项,它们在`pyproject.toml`中指定,并且版本仅适用于 SciPy 本身的构建。对于诸如`wheel`或`setuptools`之类的依赖项,可以指定范围或特定版本。对于 NumPy,我们还必须考虑 ABI 兼容性,因此我们使用`==`指定到最低支持的版本(因为 NumPy 的 ABI 是向后兼容但不是向前兼容)。

对于*运行时依赖项*(目前仅有 `numpy`),我们在`pyproject.toml`和`setup.py`的`install_requires`中指定版本范围。设置正确的上限值略微棘手。如果我们不设置任何限制,那么几年后可能会引入一个太新的版本,并且 NumPy 可能会在此期间弃用并删除 SciPy 依赖的某些 API。另一方面,如果我们将上限设置为最新已发布的版本,那么一旦发布新的 NumPy 版本,将不会有与之兼容的 SciPy 版本。考虑到 NumPy 和 SciPy 都以每年两次的节奏发布,并且在 NumPy 中弃用的功能应该在未来两个版本中保留,我们将上限设置为 `<1.xx+3.0`(其中 `xx` 是最新已发布的 NumPy 的次要版本)。### 支持的 Python 和 NumPy 版本

SciPy 支持的 [Python](https://www.python.org) 版本在`setup.py`的 PyPI 分类列表中列出,并且在每个发布的发行说明中提到。所有新发布的 Python 版本将尽快得到支持。关于放弃支持 Python 或 NumPy 版本的一般政策,请参阅 [NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html#nep29 "(在 NumPy Enhancement Proposals 中)")。最终放弃支持的决定始终由 scipy-dev 邮件列表决定。

SciPy 版本对应的最低支持的 [NumPy](https://numpy.org) 版本在发行说明中提到,并且编码在`pyproject.toml`、`scipy/__init__.py`以及`setup.py`的`install_requires`字段中。通常,最新的 SciPy 发布支持约 5-7 个 NumPy 的次要版本:最多支持 2.5 年前的 NumPy 版本(考虑到 NumPy 发布频率约为每年 2 次),再加上未来两个版本。

可选依赖项和编译器支持的受支持版本在 Toolchain Roadmap 中有文档化。请注意,并非所有受支持的可选依赖项版本都经过 SciPy 的持续集成设置的充分测试或根本未经测试。有关此问题的问题已在问题跟踪器或邮件列表中解决。

### 构建二进制安装程序

注意

本节仅关于构建 SciPy 二进制安装程序以 *分发*。有关在将来使用的同一台计算机上构建 SciPy 的信息,请参阅 [此 scipy.org 页面](https://scipy.github.io/devdocs/dev/contributor/building.html)。

在构建二进制文件并在 PyPI 或其他地方分发它们时,有许多需要考虑的因素。

**General**

+   一个二进制文件特定于单个 Python 版本(因为不同的 Python 版本在至少到 Python 3.4 之前不兼容 ABI)。

+   构建时请针对需要支持的最低 NumPy 版本进行构建,然后它将适用于所有具有相同主版本号的 NumPy 版本(NumPy 确实保持向后 ABI 兼容性)。

+   用于构建可移植 SciPy 二进制文件的最简单可用工具链是我们的 `cibuildwheel` 基础设施,适用于常见平台,详细信息可在我们的 CI 基础设施代码中找到,并通过 Windows、Linux 和 MacOS 上的 `cibuildwheel` 命令使用,尽管在某些情况下可能需要一些额外的外部依赖项。

**Windows**

+   对于使用免费工具链构建的 64 位 Windows 安装程序,请使用文档化方法,位于 [`github.com/numpy/numpy/wiki/Mingw-static-toolchain`](https://github.com/numpy/numpy/wiki/Mingw-static-toolchain)。一旦确保该工具链的维护是可持续的长期,该方法可能会被用于 SciPy 本身。有关详细信息,请参阅 [MingwPy](https://mingwpy.github.io) 项目和 [此线程](https://mail.python.org/pipermail/numpy-discussion/2015-October/074056.html)。

+   在 Windows 上生成 64 位安装程序的另一种方法是使用 `icc`、`ifort` 和 `MKL`(或者使用 `MSVC` 替代 `icc`)。有关 Intel 工具链的详细说明,请参阅 [本文](https://software.intel.com/en-us/articles/numpyscipy-with-intel-mkl),而有关(部分)MSVC 说明,请参阅 [此 wiki 页面](https://github.com/numpy/numpy/wiki/Building-with-MSVC)。

+   旧版 SciPy 发布包含一个 `.exe` 的“超级包”安装程序。这些包含了 3 个完整的构建版本(没有 SSE、SSE2、SSE3),并且是使用 [`github.com/numpy/numpy-vendor`](https://github.com/numpy/numpy-vendor) 构建的。这种构建设置已经众所周知不再有效并且不再受支持。它使用的是 g77 而不是 gfortran,这是由于复杂的 DLL 分发问题(参见 [gh-2829](https://github.com/scipy/scipy/issues/2829))。由于该工具链不再受支持,不再需要 g77 支持,现在 SciPy 可以包含 Fortran 90/95 代码。

**Linux**

+   可以通过[manylinux](https://github.com/pypa/manylinux/)项目生成与 PyPI 兼容的 Linux 轮子,这在我们的 `cibuildwheel` 基础设施中使用。

其他 Linux 构建设置导致 PyPI 不兼容的轮子,这些轮子需要通过自定义渠道分发,例如在[Wheelhouse](https://pypi.org/project/Wheelhouse)中查看,在[wheel](https://wheel.readthedocs.io/)和[Wheelhouse](https://pypi.org/project/Wheelhouse)文档中。## Making a SciPy release

在最高层次上,这是发布经理发布新的 SciPy 版本所做的事情:

1.  在 scipy-dev 邮件列表上提出一个发布时间表。

1.  为发布创建维护分支。

1.  给发布版本打标签。

1.  构建所有发布工件(源代码、安装程序、文档)。

1.  上传发布工件。

1.  公布发布消息。

1.  将相关更改移植到发布说明和构建脚本到主分支。

在本指南中,我们试图详细描述如何执行上述每个步骤。除了必须由发布经理执行的步骤外,这里还描述了与发布相关的活动和利益的约定:

+   后移操作

+   标签和里程碑

+   版本编号

+   支持的 Python 和 NumPy 版本

+   弃用信息

### 提出发布时间表。

典型的发布周期如下:

+   创建维护分支。

+   发布 beta 版本。

+   发布“发布候选版”(RC)。

+   如果需要,发布一个或多个新的 RC。

+   一旦最后一个发布候选版没有问题,发布最终版本。

通常每个步骤之间至少有一周的时间。经验表明,新的次要版本需要 4 到 8 周的周期。Bug 修复版本不需要 beta 或 RC,并且可以更快完成。

理想情况下,最终发布与最后一个 RC 相同,但可能会有轻微差异 - 由发布经理判断风险。通常情况下,如果编译代码或复杂的纯 Python 代码发生变化,则需要新的 RC,而从主分支后移的简单错误修复则不需要新的 RC。

要提出时间表,请发送一个列表,包含分支、beta/rc/final 发布的预计日期给 scipy-dev。在同一封电子邮件中,请大家检查是否有重要问题/PR 需要包含,但未标记为发布里程碑或“backport-candidate”标签。

### 创建维护分支。

在分支之前,请尽可能更新发布说明。在发布说明中包括 `tools/gh_lists.py` 和 `tools/authors.py` 的输出。

维护分支命名为 `maintenance/<major>.<minor>.x`(例如 0.19.x)。要创建一个分支,只需将带有正确名称的分支推送到 scipy 仓库。立即在主分支上推送一个增加版本号并添加该新版本发布说明的提交。发送电子邮件到 scipy-dev,让人们知道您已完成此操作。

### 更新版本切换器

需要更新版本切换器下拉菜单中的新发布信息。

+   `doc/source/_static/version_switcher.json`:添加新发布版本以及新的开发版本。

### 更新依赖项的上限

在主分支中,我们不设置上限,因为我们希望在那里测试新的发布版或开发版本的依赖项。但是,在维护分支中,目标是能够创建多年有效的发布版本。因此,必须设置正确的上限。创建维护分支后,必须更新以下位置:

+   `pyproject.toml`:所有构建时的依赖项,以及支持的 Python 版本

    和 NumPy 版本

+   `setup.py`:支持的 Python 和 NumPy 版本

+   `scipy/__init__.py`:用于 NumPy 版本检查

每个文件都有描述如何设置正确上限的注释。

### 标记发布

首先确保您已正确设置 GPG。参见 [`github.com/scipy/scipy/issues/4919`](https://github.com/scipy/scipy/issues/4919) 关于签署发布标签的讨论,以及 [`keyring.debian.org/creating-key.html`](https://keyring.debian.org/creating-key.html) 创建 GPG 密钥的说明(如果您没有)。请注意,在某些平台上,使用 `gpg2` 而不是 `gpg` 可能更适合,以便密码可以由 `gpg-agent` 存储,如 [`github.com/scipy/scipy/issues/10189`](https://github.com/scipy/scipy/issues/10189) 中讨论的那样。在远程准备发布时,可能需要在 `~/.gnupg/gpg-agent.conf` 中设置 `pinentry-mode loopback`,因为否则使用 `gpg2` 将通过无法访问的图形密码提示进行。

要使您的密钥更容易被识别为您自己,考虑发送您的密钥到公共密钥服务器,使用像以下命令一样:

```py
gpg --send-keys <yourkeyid> 

检查分支中是否有所有相关的提交。特别是检查里程碑下的问题和 PR(github.com/scipy/scipy/milestones),标记为“backport-candidate”的 PR,以及更新并包含在 html 文档中的发布说明。

然后编辑 meson.buildtools/version_utils.py 来获取正确的版本号(在前者中设置 version:,在后者中设置 ISRELEASED = True),并使用像 REL: set version to <version-number> 这样的消息提交。但不要立即将此提交推送到 SciPy 仓库。

最后在本地标记发布版本使用 git tag -s <v1.x.y>-s 确保标签已签名)。如果首选 gpg2,则可以适当执行 git config --global gpg.program gpg2。继续构建发布的工件(下一节)。只有在成功构建了 sdists 和文档后才将发布提交推送到 scipy 存储库。然后继续构建 wheels。只有在 TravisCI 和 Appveyor 上所有 wheels 成功构建后才将发布标签推送到存储库(如果失败,则必须移动标签,这是不良实践)。最后,在推送标签后,还需推送第二个提交,增加版本号并为 version: 追加 .dev0,并再次将 ISRELEASED 设置为 False。对于新的发布候选版本以及从发布候选版本到正式发布时移除 rc 附加内容也适用。

构建发布的工件

这是发布时创建的所有工件的完整列表:

  • sdist (scipy-x.y.y.tar.gz,用于 PyPI 和 GitHub 发布)

  • 适用于 Windows、Linux 和 macOS 的二进制 wheels

  • 文档(html)

  • 一个 README.txt 文件

  • 一个 Changelog 文件

通过运行 python -m build --sdist 生成一个 sdist(注意:我们仍需将其移入 CI 作业!),并通过运行 python dev.py notes(带有标签,请参阅 python dev.py notes --help)在存储库根目录生成 Changelog 和 README,最终在 REPO_ROOT/release/ 中生成。在本地创建签名标签后执行此操作。如果完成无误,请推送发布提交(不是标签,请参见上文)至 scipy 存储库。

要构建 wheels,请推送一个包含文本 [wheel build] 的提交到用于当前发布的分支。这将触发所有需要的 Python 版本和平台的 cibuildwheel 构建。应该已在分支后立即更新了 NumPy 和其他依赖项的适当版本固定。如果 wheel 构建显示需要通过维护分支上的后向移植修复的问题,可以删除本地标签(例如 git tag -d v1.2.0rc1)并重新在新的候选提交上执行上述标记。

cibuildwheel 基础设施从构建的 wheels 运行测试,如果测试通过,则将 wheels 上传至 anaconda.org/multibuild-wheels-staging/scipy

从这里可以下载它们以上传到 PyPI。可以使用 tools/download-wheels.py 自动完成此操作:

$ python tools/download-wheels.py 1.5.0rc1 -w REPO_ROOT/release/installers 

之后,我们希望重新生成 README 文件,以便在其中包含刚刚下载的 wheels 的 MD5 和 SHA256 校验和。再次运行 python dev.py notes

上传发布的工件

对于发布,目前有五个网络位置可用于上传内容:

  • PyPI(sdist, wheels)

  • GitHub 发布(sdist、发布说明、Changelog)

  • scipy.org(发布公告)

  • docs.scipy.org(html 文档)

PyPI:

首先上传 wheels,然后上传 sdist:

twine upload REPO_ROOT/release/installers/*.whl
twine upload REPO_ROOT/release/installers/scipy-1.x.y.tar.gz 

Github 发布:

github.com/scipy/scipy/releases上使用 GUI 创建发布,并上传所有发布的工件。在这个阶段,推送标签并将新发布(候选版)与该标签关联是适当的。例如,git push upstream v1.2.0rc1,其中upstream表示scipy/scipy。检查之前的发布,确切确定应包括哪些工件在 GUI 上传过程中非常有用。还请注意,发布说明不会自动填充到 GitHub 上的发布描述中,手动重新格式化为 Markdown 以匹配网站上以前的发布格式是非常有帮助的。一般情况下,我们不在这些 GUI 描述中包含问题和拉取请求列表。

scipy.org:

该站点的源码位于github.com/scipy/scipy.org。通过 PR 更新content/en/news.md中的新闻部分。这仅适用于正式发布,不包括发布候选版。

docs.scipy.org:

首先,在scipy/doc/中运行make dist来构建 scipy 文档。确认它们看起来正常,然后使用make upload USERNAME=rgommers RELEASE=0.19.0将它们上传到文档服务器。请注意,需要 SSH 访问文档服务器;如果没有,请向@pv(服务器管理员)、@tylerjereddy 或@rgommers(可以上传)询问。

该网站本身的源码维护在github.com/scipy/docs.scipy.org/。在index.rst的发布表中添加新的 SciPy 版本。推送该提交,然后运行make upload USERNAME=yourusername。这仅适用于正式发布,不包括发布候选版。

结束

发送邮件宣布以下邮件列表的发布:

  • scipy-dev

  • numpy-discussion

  • python-announce(不包括 beta/rc 版本)

对于 beta 和 rc 版本,请在邮件中要求人们测试(运行 scipy 测试并针对其自己的代码测试),并在 GitHub 或 scipy-dev 上报告问题。

完成最终发布后,将相关更改移植到发布说明、构建脚本、tools/authors.py中的作者名称映射以及仅在维护分支上进行的任何其他更改到主分支。

SciPy API 开发指南

原文链接:docs.scipy.org/doc/scipy-1.12.0/dev/api-dev/api-dev-toc.html

  • nan_policy 的设计规范
  • scipy.special 中添加矢量化的 ufuncs

  • 支持数组 API 标准

SciPy 项目治理

原文链接:docs.scipy.org/doc/scipy-1.12.0/dev/governance.html

本文档的目的是在普通和非常规情况下,规范 SciPy 项目使用的治理流程,并澄清决策的制定方式以及我们社区的各个元素如何互动,包括开源协作开发与可能由营利或非营利实体资助的工作之间的关系。

该项目

SciPy 项目(该项目)是一个开源软件项目。该项目的目标是开发 Python 科学计算的开源软件,特别是 scipy 软件包。由该项目开发的软件在 BSD(或类似)开源许可下发布,以公开方式开发,并托管在 scipy GitHub 组织的公共 GitHub 仓库上。

项目由一个称为贡献者的分布式开发者团队开发。贡献者是指为项目贡献代码、文档、设计或其他工作的个人。任何人都可以成为贡献者。贡献者可以隶属于任何法律实体或无隶属。贡献者通过提交、审核和讨论 GitHub Pull 请求和问题,以及参与 GitHub、邮件列表和其他渠道的开放和公开项目讨论来参与项目。项目参与的基础是开放性和透明度。

该项目社区由所有贡献者和用户组成。贡献者代表并对更大的项目社区负责,我们致力于尽可能降低贡献者和用户之间的障碍。

该项目不是法律实体,也没有与法律实体当前有任何正式关系。

治理

本节描述了该项目的治理和领导模型。

项目治理的基础是:

  • 开放性和透明度

  • 积极贡献

  • 机构中立性

传统上,项目领导由贡献者的一个子集提供,称为核心开发者,他们的积极和持续贡献通过获得“提交权限”到项目 GitHub 仓库而得到认可。总体上,所有项目决策都是通过核心开发者共识和社区输入来做出的。

虽然这种方法为我们服务良好,随着项目的发展,我们看到需要一个更正式的治理模型。SciPy 核心开发者表达了对包括 BDFL(终身仁慈独裁者)在内的领导模型的偏好。因此,未来该项目的领导将由一个 BDFL 和指导委员会组成。

BDFL

项目将有一个 BDFL(终身仁慈独裁者),目前是 Pauli Virtanen。作为独裁者,BDFL 有权为项目做出所有最终决策。作为仁慈的一面,BDFL 在实践中选择将这种权力推迟到社区讨论渠道和 Steering Council 的共识(见下文)。预计且过去确实如此,BDFL 很少会主张他/她的最终权力。由于很少被使用,我们将 BDFL 的最终权力称为“特别”或“优先”投票。当发生这种情况时,BDFL 的覆盖通常发生在 Steering Council 出现僵局或如果 Steering Council 要求 BDFL 在特定事项上做出决定的情况下。为确保 BDFL 的仁慈,项目鼓励其他人在不同意 BDFL 总体方向的情况下分叉项目。BDFL 可以根据自己的意愿将他/她在某个决定或一系列决策上的权力委派给任何其他理事会成员。

BDFL 可以任命他/她的继任者,但预期会在此决定上征求 Steering Council 的意见。如果 BDFL 无法任命继任者,则 Steering Council 将做出这一决定 - 最好是通过共识,但如果需要,也可以通过多数投票。

注意,BDFL 可以随时下台,并且会在诚信的前提下,听取有关下台的严肃呼吁。还要注意,BDFL 更多地是用于后备决策,而不是董事/首席执行官的角色。

Steering Council

项目将设有一个由项目贡献者组成的 Steering Council,这些贡献者在质量和数量上都有显著的贡献,并且这种贡献至少持续了一年。理事会的总体角色是通过与 BDFL 合作并接受社区的意见,确保项目的长期福祉,无论是在技术上还是作为一个社区。

理事会将有一名主席,负责保持理事会和项目运作的组织方面的顺利进行。理事会还将指定一个项目发布经理,对一个或多个版本的最终责任负责。

在日常项目活动中,理事会成员作为与所有其他贡献者和社区同等的伙伴参与所有讨论、代码审查和其他项目活动。在这些日常活动中,理事会成员不因其在理事会上的成员身份而享有任何特权或特权。然而,预计由于他们的贡献质量和数量以及他们对项目软件和服务的专业知识,理事会成员将为潜在经验较少的贡献者提供有用的技术指导和项目方向指导。

Steering Council 和其成员在某些情况下发挥特殊作用。具体来说,理事会可能会:

  • 就项目的整体范围、愿景和方向做出决策。

  • 就与其他组织或个人的战略合作做出决策。

  • 就特定的技术问题、功能、错误和拉取请求做出决策。他们是引导代码审查过程和合并拉取请求的主要机制。

  • 对由项目运行的服务做出决策,并为项目和社区的利益管理这些服务。

  • 在常规社区讨论在合理时间内未能达成共识的问题上做出决策。

  • 更新诸如此类的政策文件。

董事会成员资格

要成为董事会成员,个人必须是项目贡献者,其贡献在质量和数量上都相当可观,并且在至少一年的时间内保持持续性。潜在的董事会成员由现任董事会成员提名,并在询问潜在成员是否有兴趣和意愿担任该职位后,由现任董事会成员投票决定。董事会最初将由自 2017 年 1 月起在过去两年内显著活跃的现有核心开发者组成。

在考虑潜在成员时,董事会将综合考虑候选人的贡献。这将包括但不限于代码、代码审查、基础设施工作、邮件列表和聊天参与、社区帮助/建设、教育和推广、设计工作等。我们有意不设定任意的定量指标(如“在此存储库中有 100 次提交”),以避免鼓励仅追求指标而非项目整体健康的行为。我们希望在团队中鼓励多样化的背景、观点和才能,因此我们明确不将代码定义为评估董事会成员资格的唯一标准。

如果董事会成员在项目中处于一年的不活跃状态,将被考虑从董事会中删除。在删除之前,将与不活跃成员联系,看是否计划重新参与活跃。如果不计划重新参与,则将根据董事会投票立即将其删除。如果计划很快重新参与活跃,则将给予一年的宽限期。如果在此期限内不返回活跃状态,则将通过董事会投票将其移除,不再给予进一步的宽限期。所有前董事会成员可以随时再次被考虑成为未来的任何项目贡献者。退休的董事会成员将被列入项目网站,以承认其在董事会活跃期间的时段。

如果被认为对项目的健康状况有积极危害,并且沟通和冲突解决尝试失败,董事会保留将当前成员(除 BDFL 外)驱逐出局的权利。

当前 Steering Council 成员列表维护在关于我们页面。

理事会主席

主席将由 Steering Council 指定。主席可以任职任意时间,但可以随时辞职,并会认真考虑辞职的要求(类似于 BDFL 角色)。主席负责:

  • 每年两次(约在四月中旬和十月中旬)开始审查项目的技术方向(如 SciPy Roadmap 中所述)。

  • 在同一年的相同时间段,总结之前时期的任何相关组织更新和问题,并在邮件列表上征求反馈/建议。

  • 确保 Steering Council 的成员组成保持最新状态。

  • 确保 Steering Council 私下讨论的事项在邮件列表上得到总结,以保持社区的信息透明。

  • 确保其他重要的组织文件(例如行为准则、财务赞助协议)在添加后保持最新状态。

发布经理

发布经理对发布承担最终责任。包括:

  • 提议和决定发布时间。

  • 在特定变更或功能上没有达成共识时,确定发布内容。

  • 创建发布并在相关公共渠道宣布发布。

欲了解这些职责在实践中的具体内容,请参阅 SciPy 发布。

利益冲突

预计 BDFL 和理事会成员将受雇于各种公司、大学和非营利组织。因此,成员可能存在利益冲突。此类利益冲突包括但不限于:

  • 财务利益,例如投资、就业或与项目外的合同工作,可能会影响他们在项目上的工作。

  • 可能泄露到项目工作中的雇主专有信息的访问。

所有理事会成员,包括 BDFL 在内,应向理事会其余成员披露可能存在的利益冲突。在某个问题上存在利益冲突的成员可以参与讨论,但必须在投票时回避。如果 BDFL 在特定决策中回避自己,理事会将指定替代 BDFL 进行该决策。

理事会的私人通信

除非有特别要求,所有理事会的讨论和活动都将是公开的,并与项目贡献者和社区进行协作和讨论。理事会将有一个私人邮件列表,只在特定事项需要保密时才会适度使用。当需要私人沟通和决策时,理事会将尽最大努力在删除不应公开到公共互联网的个人/私人/敏感信息后向社区总结。

理事会决策制定

如果需要项目指导理事会做出正式决定,他们将采用一种Apache Foundation 投票过程的形式。这是共识的正式化版本,其中+1 代表同意,-1 代表否决(必须附上理由,如上所述),如果希望表达意见而不注册全面否决,也可以进行分数投票(例如-0.5、+0.5)。这些数字投票通常也被非正式地用作获取人们对某个问题的整体感觉的一种方式,通常不应视为正式投票。只有在明确声明的情况下才会进行正式投票,如果确实发生这种情况,则应该充分留出时间,以便所有感兴趣的理事会成员有机会回应,至少一周。

在实践中,我们预计对于大多数理事会决策(例如,选举新成员)将需要更为非正式的过程。

机构合作伙伴和资金

理事会是项目的主要领导机构。除了作为贡献者和理事会成员参与项目外,没有外部机构、个人或法律实体有能力拥有、控制、篡夺或影响项目。然而,由于机构可以是项目的重要资金机制,因此正式承认机构参与项目是很重要的。这些是机构合作伙伴。

机构贡献者是指作为其所属机构官方职责的一部分向项目做出贡献的个人项目贡献者。同样地,机构理事会成员是指作为其所属机构官方职责的一部分向项目做出贡献的项目指导理事会成员。

根据这些定义,机构合作伙伴是在任何国家都承认的法律实体,至少雇用了一个机构贡献者或机构理事会成员。机构合作伙伴可以是营利性或非营利性实体。

通过雇佣积极参与项目作为其官方职责的个人,机构可以成为机构合作伙伴。换句话说,合作伙伴影响项目的唯一方式是积极参与项目的开发,并与社区的其他贡献者和议会成员平等地发展项目。仅在机构环境中使用项目软件不能使实体成为机构合作伙伴。财政赠品不使实体能够成为机构合作伙伴。一旦机构有资格成为机构合作伙伴,指导委员会必须提名并批准合作伙伴关系。

如果某个现有的机构合作伙伴在某一时刻停止拥有任何贡献的雇员,那么将开始一个一年的宽限期。在这一年期满时,如果他们继续没有任何贡献的雇员,则他们的机构合作伙伴关系将失效,并且恢复将需要按照新合作伙伴关系的常规流程进行。

机构合作伙伴可以自由通过任何合法手段追求在项目上工作的资金。这可能涉及非营利组织从私人基金会和捐助者筹集资金,或营利公司构建利用项目软件和服务的专有产品和服务。机构合作伙伴为在项目上工作所获取的资金称为机构资金。然而,任何机构合作伙伴获得的资金都不能取代指导委员会的决定。如果合作伙伴有资金来进行 SciPy 工作,而议会决定不将其作为项目进行推进,合作伙伴可以自行进行。然而,在这种情况下,合作伙伴工作的那部分将不属于 SciPy 的范围,并且不能以任何方式使用项目商标表明正式关系。

机构合作伙伴的收益包括:

  • 在 SciPy 网站和演讲中的承认

  • 在 SciPy 网站和演讲中承认他们自己的资金来源的能力

  • 通过其议会成员的参与影响项目的能力

  • 议会成员受邀参加 SciPy 开发者会议

当前的机构合作伙伴列表可在页面关于我们上查看。

文档历史

github.com/scipy/scipy/commits/main/doc/source/dev/governance/governance.rst

致谢

本文档的大部分内容改编自Jupyter/IPython 项目的治理文档NumPy 的治理文档

许可证

根据CC-0 公共领域奉献/许可证,作者已尽可能放弃了 SciPy 项目治理文件的所有版权和相关或邻近权利。

发布说明

原文:docs.scipy.org/doc/scipy-1.12.0/release.html

这是 SciPy 每个版本之间的变更列表。要查看完整详情,请参见提交日志

  • SciPy 1.12.0 发布说明

  • SciPy 1.11.4 发布说明

  • SciPy 1.11.3 发布说明

  • SciPy 1.11.2 发布说明

  • SciPy 1.11.1 发布说明

  • SciPy 1.11.0 发布说明

  • SciPy 1.10.1 发布说明

  • SciPy 1.10.0 发布说明

  • SciPy 1.9.3 发布说明

  • SciPy 1.9.2 发布说明

  • SciPy 1.9.1 发布说明

  • SciPy 1.9.0 发布说明

  • SciPy 1.8.1 发布说明

  • SciPy 1.8.0 发布说明

  • SciPy 1.7.3 发布说明

  • SciPy 1.7.2 发布说明

  • SciPy 1.7.1 发布说明

  • SciPy 1.7.0 发布说明

  • SciPy 1.6.3 发布说明

  • SciPy 1.6.2 发布说明

  • SciPy 1.6.1 发布说明

  • SciPy 1.6.0 发布说明

  • SciPy 1.5.4 发布说明

  • SciPy 1.5.3 发布说明

  • SciPy 1.5.2 发布说明

  • SciPy 1.5.1 发布说明

  • SciPy 1.5.0 发布说明

  • SciPy 1.4.1 发布说明

  • SciPy 1.4.0 发布说明

  • SciPy 1.3.3 发布说明

  • SciPy 1.3.2 发布说明

  • SciPy 1.3.1 发布说明

  • SciPy 1.3.0 发布说明

  • SciPy 1.2.3 发布说明

  • SciPy 1.2.2 发布说明

  • SciPy 1.2.1 发布说明

  • SciPy 1.2.0 发布说明

  • SciPy 1.1.0 发布说明

  • SciPy 1.0.1 发布说明

  • SciPy 1.0.0 发布说明

  • SciPy 0.19.1 发布说明

  • SciPy 0.19.0 发布说明

  • SciPy 0.18.1 发布说明

  • SciPy 0.18.0 发布说明

  • SciPy 0.17.1 发布说明

  • SciPy 0.17.0 发布说明

  • SciPy 0.16.1 发布说明

  • SciPy 0.16.0 发布说明

  • SciPy 0.15.1 发布说明

  • SciPy 0.15.0 发布说明

  • SciPy 0.14.1 发布说明

  • SciPy 0.14.0 发布说明

  • SciPy 0.13.2 发布说明

  • SciPy 0.13.1 发布说明

  • SciPy 0.13.0 发布说明

  • SciPy 0.12.1 发布说明

  • SciPy 0.12.0 发布说明

  • SciPy 0.11.0 发布说明

  • SciPy 0.10.1 发布说明

  • SciPy 0.10.0 发布说明

  • SciPy 0.9.0 发布说明

  • SciPy 0.8.0 发布说明

  • SciPy 0.7.2 发布说明

  • SciPy 0.7.1 发布说明

  • SciPy 0.7.0 发布说明

SciPy 1.12.0 发行说明

原文:docs.scipy.org/doc/scipy-1.12.0/release/1.12.0-notes.html

目录

  • SciPy 1.12.0 发行说明

    • 本次发行的亮点

    • 新功能

      • scipy.cluster 改进

      • scipy.fft 改进

      • scipy.integrate 改进

      • scipy.interpolate 改进

      • scipy.linalg 改进

      • scipy.ndimage 改进

      • scipy.optimize 改进

      • scipy.signal 改进

      • scipy.sparse 改进

      • scipy.spatial 改进

      • scipy.special 改进

      • scipy.stats 改进

    • 已弃用功能

    • 过期的弃用功能

    • 不兼容的后向变更

    • 其他变更

    • 作者

    • 已关闭的问题 1.12.0

    • 1.12.0 的拉取请求

SciPy 1.12.0 是六个月辛勤工作的成果。其中包含许多新功能、大量错误修复、改进的测试覆盖率和更好的文档。此版本中还有一些弃用和 API 变更,详细记录如下。建议所有用户升级到此版本,因为修复了大量错误并进行了优化。在升级之前,建议用户检查其代码是否使用了已弃用的 SciPy 功能(方法是使用 python -Wd 运行代码并检查 DeprecationWarning)。我们的开发重点现在将转移到 1.12.x 分支的错误修复版本和主分支上添加新功能。

本次发行需要 Python 3.9+ 和 NumPy 1.22.4 或更高版本。

为了在 PyPy 上运行,需要 PyPy3 6.0+。

本次发行的亮点

  • 实验性支持数组 API 标准已添加到scipy.special的部分功能,以及所有scipy.fftscipy.cluster。可能存在 bug,欢迎使用 CuPy 数组、PyTorch 张量和其他兼容数组 API 的库提供早期反馈。可通过设置SCIPY_ARRAY_API环境变量进行测试。

  • 新的类ShortTimeFFT提供了短时傅里叶变换(STFT)、其逆变换(ISTFT)以及(交叉)谱图的更多功能实现。它采用了改进的算法来计算 ISTFT。

  • 添加了几个稀疏数组的新构造函数,并且现在许多操作还支持稀疏数组,进一步促进了从稀疏矩阵的迁移。

  • 大部分scipy.stats API 现在更好地支持处理NaN值、掩码数组和更精细的形状处理。改进了许多stats方法的准确性和性能,并添加了许多新的统计测试和分布。

新功能

scipy.cluster 的改进

  • 实验性支持已添加到数组 API 标准;现在接受 PyTorch 张量、CuPy 数组和兼容数组 API 的数组库(GPU 支持仅限于具有纯 Python 实现的函数)。支持可以转换为 NumPy 的 CPU 数组,并且返回的数组将与输入类型匹配。在导入scipy之前设置SCIPY_ARRAY_API环境变量即可启用此行为。此实验性支持仍在开发中,可能包含 bug - 欢迎进行测试。

scipy.fft 的改进

  • 实验性支持已添加到数组 API 标准;作为fft数组 API 标准扩展模块的一部分的函数,以及不在扩展模块中的快速 Hankel 变换和基本 FFT 现在接受 PyTorch 张量、CuPy 数组和兼容数组 API 的数组库。支持可以转换为 NumPy 数组的 CPU 数组,并且返回的数组将与输入类型匹配。在导入scipy之前设置SCIPY_ARRAY_API环境变量即可启用此行为。此实验性支持仍在开发中,可能包含 bug - 欢迎进行测试。

scipy.integrate 的改进

  • 添加了 scipy.integrate.cumulative_simpson,用于使用辛普森 1/3 法则从采样数据计算累积积分。

scipy.interpolate 改进

  • 新类 NdBSpline 表示 N 维张量积样条。该类只知道如何根据系数和结点向量评估张量积。这种方式将 BSpline 推广到 1D 数据到 N-D,与 NdPPoly 平行(表示 N-D 张量积多项式)。评估利用了 b 样条的局部化特性。

  • NearestNDInterpolator.__call__ 接受 **query_options 参数,这些参数会传递到 KDTree.query 调用中以查找最近邻。例如,可以通过 workers 关键字限制邻居搜索距离并并行化查询。

  • BarycentricInterpolator 现在允许计算导数。

  • 现在可以在现有的 CloughTocher2DInterpolator 实例中更改插值点的插值值,同时还保存插值点的重心坐标。

scipy.linalg 改进

  • 通过 dtgsylstgsyl 提供对新的低级 LAPACK 函数的访问。

scipy.ndimage 改进

scipy.optimize 改进

  • 添加了 scipy.optimize.isotonic_regression 以允许非参数保序回归。

  • scipy.optimize.nnls 重写为 Python,并实现了所谓的 fnnls 或快速 nnls,使其在高维问题上更有效率。

  • scipy.optimize.rootscipy.optimize.root_scalar 的结果对象现在报告所使用的方法。

  • scipy.optimize.differential_evolutioncallback 方法现在可以通过 intermediate_results 关键字参数传递更详细的信息。此外,进化策略现在接受一个可调用对象进行额外定制。differential_evolution 的性能也得到了改进。

  • scipy.optimize.minimize 方法 Newton-CG 现在支持返回稀疏 Hessian 矩阵/数组的函数作为 hess 参数,并且略微更有效。

  • scipy.optimize.minimize 方法 BFGS 现在接受 Hessian 逆的初始估计,这在某些情况下可以更高效地进行工作流程。新参数为 hess_inv0

  • scipy.optimize.minimize 方法 CGNewton-CGBFGS 现在接受参数 c1c2,允许指定 Armijo 和曲率规则参数。

  • scipy.optimize.curve_fit 由于对可调用函数的更有效的记忆化,性能有所提升。

scipy.signal 的改进

  • fs 有默认值时,freqzfreqz_zpkgroup_delay 现在更加精确。

  • 新的类 ShortTimeFFT 提供了短时傅里叶变换(STFT)的更多功能实现,包括其逆变换(ISTFT)以及(交叉)谱图。它利用改进的算法计算基于双窗口的 ISTFT,并在参数化方面提供了更精细的控制,特别是在缩放和相位移方面。增加了功能以便于处理信号和 STFT 块。在“SciPy 用户指南”中增加了一个章节,提供算法细节。函数 stftistftspectrogram 被标记为遗留功能。

scipy.sparse 的改进

  • sparse.linalg 迭代求解器 sparse.linalg.cgsparse.linalg.cgssparse.linalg.bicgsparse.linalg.bicgstabsparse.linalg.gmressparse.linalg.qmr 现已用 Python 重写。

  • 更新了内置的 SuperLU 版本至 6.0.1,并进行了一些额外的修复。

  • 稀疏数组增加了额外的构造函数:eye_arrayrandom_arrayblock_arrayidentitykronkronsum 已调整以支持在稀疏数组上的操作。

  • 稀疏矩阵现在支持使用 axes=(1, 0) 进行转置,以镜像 .T 方法。

  • LaplacianNd 现在允许选择最大特征值的子集,并且额外支持检索对应的特征向量。LaplacianNd 的性能也得到了提升。

  • 改进了 dok_matrixdok_array 的性能,并且它们的继承行为应该更加健壮。

  • hstackvstackblock_diag 现在可以处理稀疏数组,并保留输入的稀疏类型。

  • 添加了一个新函数 scipy.sparse.linalg.matrix_power,允许对稀疏数组进行指数运算。

scipy.spatial 的改进

  • spatial.transform.Rotation 实现了两种新方法:__pow__ 用于将旋转提升到整数或分数幂次,以及 approx_equal 用于检查两个旋转是否近似相等。

  • 方法 Rotation.align_vectors 已扩展为解决约束对齐问题,其中要求精确对齐两个向量。此外,当给定单个向量对时,算法现在返回最小幅度的旋转,这可以视为一个较小的不兼容性变更。

  • 现在可以通过 from_davenportas_davenport 方法获取 spatial.transform.Rotation 的一种新表示,称为 Davenport 角度。

  • distance.hammingdistance.correlation 进行了性能改进。

  • 提升了 SphericalVoronoi 的性能,sort_vertices_of_regions 和二维区域计算。

scipy.special 的改进

  • 添加了 scipy.special.stirling2 以计算第二类 Stirling 数。支持精确计算和渐近近似(默认)分别通过 exact=Trueexact=False(默认)。

  • 添加了 scipy.special.betaincc 用于计算互补不完全 Beta 函数和 scipy.special.betainccinv 用于计算其逆函数。

  • 提高了 scipy.special.betaincscipy.special.betaincinv 的精度。

  • 已为备用后端添加实验性支持:函数scipy.special.log_ndtrscipy.special.ndtrscipy.special.ndtriscipy.special.erfscipy.special.erfcscipy.special.i0scipy.special.i0escipy.special.i1scipy.special.i1escipy.special.gammalnscipy.special.gammaincscipy.special.gammainccscipy.special.logit,以及scipy.special.expit 现在支持 PyTorch 张量和 CuPy 数组。这些功能仍在开发中,可能存在错误,因此默认情况下已禁用;在导入 scipy 之前通过设置 SCIPY_ARRAY_API 环境变量为 1 启用它们。欢迎进行测试!

scipy.stats 改进

  • 添加了 scipy.stats.quantile_test,用于非参数检验是否假设值为指定概率关联的分位数。结果对象的 confidence_interval 方法给出了分位数的置信区间。

  • scipy.stats.sampling.FastGeneratorInversion 提供了通过数值反演分布 CDF 快速进行随机抽样的便捷接口。

  • scipy.stats.geometric_discrepancy 添加了用于随机样本的几何/拓扑差异度量。

  • scipy.stats.multivariate_normal 现在具有 fit 方法,通过最大似然估计将分布参数拟合到数据中。

  • scipy.stats.bws_test 执行巴姆加特纳-韦斯-辛德勒测试,检验两个样本是否来自同一分布。

  • scipy.stats.jf_skew_t 实现了琼斯和法迪偏态-t 分布。

  • scipy.stats.anderson_ksamp 现在支持使用 method 参数进行置换版本的测试。

  • scipy.stats.halfcauchyscipy.stats.halflogisticscipy.stats.halfnormfit 方法更快且更精确。

  • scipy.stats.beta 对于分布参数的极端值,entropy 精度得到了提高。

  • 对于多个分布,sf 和/或 isf 方法的精度得到了提高:scipy.stats.burrscipy.stats.hypsecantscipy.stats.kappa3scipy.stats.loglaplacescipy.stats.lognormscipy.stats.lomaxscipy.stats.pearson3scipy.stats.rdistscipy.stats.pareto

  • 现在,以下函数支持参数 axisnan_policykeep_dimsscipy.stats.entropy, scipy.stats.differential_entropy, scipy.stats.variation, scipy.stats.ansari, scipy.stats.bartlett, scipy.stats.levene, scipy.stats.fligner, scipy.stats.circmean, scipy.stats.circvar, scipy.stats.circstd, scipy.stats.tmean, scipy.stats.tvar, scipy.stats.tstd, scipy.stats.tmin, scipy.stats.tmax, 和 scipy.stats.tsem.

  • scipy.stats.skewnormlogpdf 方法和 fit 方法已经得到了改善。

  • 贝塔负二项分布的实现为 scipy.stats.betanbinom

  • scipy.stats.invwishartrvslogpdf 的性能得到了改进。

  • 在使用 method='mle' 时,scipy.stats.boxcox_normmax 中的中间溢出问题已被解决,并且 lmbda 的返回值受到约束,以确保转换后的数据不会溢出。

  • scipy.stats.nakagami stats 更加准确可靠。

  • 消除了scipy.norminvgauss.pdf中的中间溢出源。

  • scipy.stats.circmeanscipy.stats.circvarscipy.stats.circstdscipy.stats.entropy添加了对掩码数组的支持。

  • scipy.stats.dirichlet方法新增了一个协方差(cov)方法。

  • 提高了scipy.stats.multivariate_t方法在大自由度下的熵方法的准确性。

  • scipy.stats.loggamma方法的熵计算方式得到了改进。

已弃用功能

  • 对于不存在于公共命名空间中的对象,错误消息变得更加清晰,对于根本不应被导入的私有属性,警告也得到了加强。

  • scipy.signal.cmplx_sort已经被弃用,并将在 SciPy 1.15 版本中移除。您可以在弃用消息中找到可替代方案。

  • scipy.integrate.cumulative_trapezoid中的参数initial,除了0None之外的值已经弃用。

  • scipy.stats.rvs_ratio_uniforms已被弃用,推荐使用scipy.stats.sampling.RatioUniforms

  • scipy.integrate.quadraturescipy.integrate.romberg因准确性问题和接口缺陷已被弃用。它们将在 SciPy 1.15 版本中移除。请使用scipy.integrate.quad代替。

  • 随着函数签名的即将更改(例如移除过时关键字),我们正在取消使用关键字参数的位置用法,这将从 SciPy 1.14 开始引发错误。在某些情况下,这延迟了最初宣布的移除日期,以便有时间应对第二部分弃用。受影响的函数包括:

    • linalg.{eigh, eigvalsh, pinv}

    • integrate.simpson

    • signal.{firls, firwin, firwin2, remez}

    • sparse.linalg.{bicg, bicgstab, cg, cgs, gcrotmk, gmres, lgmres, minres, qmr, tfqmr}

    • special.comb

    • stats.kendalltau

  • 所有小波函数已弃用,PyWavelets 提供了合适的实现;受影响的函数有:signal.{daub, qmf, cascade, morlet, morlet2, ricker, cwt}

  • scipy.integrate.trapz, scipy.integrate.cumtrapzscipy.integrate.simps 已弃用,改用 scipy.integrate.trapezoid, scipy.integrate.cumulative_trapezoidscipy.integrate.simpson,并将在 SciPy 1.14 中移除。

  • scipy.sparse.linalg.{bcg, bicgstab, cg, cgs, gcrotmk, gmres, lgmres, minres, qmr, tfqmr}tol 参数现已弃用,改用 rtol,并将在 SciPy 1.14 中移除。此外,这些函数的 atol 默认值将在 SciPy 1.14 中更改为 0.0

过期弃用

正在努力完成长期弃用的工作。以下先前弃用的功能受到影响:

  • scipy.stats.qmc.LatinHypercubecentered 关键字已移除。使用 scrambled=False 替代 centered=True

  • scipy.stats.binom_test 已移除,使用 scipy.stats.binomtest 替代。

  • scipy.stats.iqr 中,移除了使用 scale='raw' 的方式,改用 scale=1

向后不兼容的更改

其他更改

  • 编译和链接 SciPy 使用的参数现在可以通过 show_config 获取。

作者

  • Name (commits)

  • endolith (1)

  • h-vetinari (34)

  • Tom Adamczewski (3) +

  • Anudeep Adiraju (1) +

  • akeemlh (1)

  • Alex Amadori (2) +

  • Raja Yashwanth Avantsa (2) +

  • Seth Axen (1) +

  • Ross Barnowski (1)

  • Dan Barzilay (1) +

  • Ashish Bastola (1) +

  • Christoph Baumgarten (2)

  • Ben Beasley (3) +

  • Doron Behar (1)

  • Peter Bell (1)

  • Sebastian Berg (1)

  • Ben Boeckel (1) +

  • David Boetius (1) +

  • Matt Borland (1)

  • Jake Bowhay (103)

  • Larry Bradley (1) +

  • Dietrich Brunn (5)

  • Evgeni Burovski (102)

  • Matthias Bussonnier (18)

  • CJ Carey (6)

  • Colin Carroll (1) +

  • Aadya Chinubhai (1) +

  • Luca Citi (1)

  • Lucas Colley (141) +

  • com3dian (1) +

  • Anirudh Dagar (4)

  • Danni (1) +

  • Dieter Werthmüller (1)

  • John Doe (2) +

  • Philippe DONNAT (2) +

  • drestebon (1) +

  • Thomas Duvernay (1)

  • elbarso (1) +

  • emilfrost (2) +

  • Paul Estano (8) +

  • Evandro (2)

  • Franz Király (1) +

  • Nikita Furin (1) +

  • gabrielthomsen (1) +

  • Lukas Geiger (9) +

  • Artem Glebov (22) +

  • Caden Gobat (1)

  • Ralf Gommers (127)

  • Alexander Goscinski (2) +

  • Rohit Goswami (2) +

  • Olivier Grisel (1)

  • Matt Haberland (244)

  • Charles Harris (1)

  • harshilkamdar (1) +

  • Alon Hovav (2) +

  • Gert-Ludwig Ingold (1)

  • Romain Jacob (1) +

  • jcwhitehead (1) +

  • Julien Jerphanion (13)

  • He Jia (1)

  • JohnWT (1) +

  • jokasimr (1) +

  • Evan W Jones (1)

  • Karen Róbertsdóttir (1) +

  • Ganesh Kathiresan (1)

  • Robert Kern (11)

  • Andrew Knyazev (4)

  • Uwe L. Korn (1) +

  • Rishi Kulkarni (1)

  • Kale Kundert (3) +

  • Jozsef Kutas (2)

  • Kyle0 (2) +

  • Robert Langefeld (1) +

  • Jeffrey Larson (1) +

  • Jessy Lauer (1) +

  • lciti (1) +

  • Hoang Le (1) +

  • Antony Lee (5)

  • Thilo Leitzbach (4) +

  • LemonBoy (2) +

  • Ellie Litwack (8) +

  • Thomas Loke (4) +

  • Malte Londschien (1) +

  • Christian Lorentzen (6)

  • Adam Lugowski (10) +

  • lutefiskhotdish (1)

  • mainak33 (1) +

  • Ben Mares (11) +

  • mart-mihkel (2) +

  • Mateusz Sokół (24) +

  • Nikolay Mayorov (4)

  • Nicholas McKibben (1)

  • Melissa Weber Mendonça (7)

  • Michał Górny (1)

  • Kat Mistberg (2) +

  • mkiffer (1) +

  • mocquin (1) +

  • Nicolas Mokus (2) +

  • Sturla Molden (1)

  • Roberto Pastor Muela (3) +

  • Bijay Nayak (1) +

  • Andrew Nelson (105)

  • Praveer Nidamaluri (3) +

  • Lysandros Nikolaou (2)

  • Dimitri Papadopoulos Orfanos (7)

  • Pablo Rodríguez Pérez (1) +

  • Dimitri Papadopoulos (2)

  • Tirth Patel (14)

  • Kyle Paterson (1) +

  • Paul (4) +

  • Yann Pellegrini (2) +

  • Matti Picus (4)

  • Ilhan Polat (36)

  • Pranav (1) +

  • Bharat Raghunathan (1)

  • Chris Rapson (1) +

  • Matteo Raso (4)

  • Tyler Reddy (215)

  • Martin Reinecke (1)

  • Tilo Reneau-Cardoso (1) +

  • resting-dove (2) +

  • Simon Segerblom Rex (4)

  • Lucas Roberts (2)

  • Pamphile Roy (31)

  • Feras Saad (3) +

  • Atsushi Sakai (3)

  • Masahiro Sakai (2) +

  • Omar Salman (14)

  • Andrej Savikin (1) +

  • Daniel Schmitz (55)

  • Dan Schult (19)

  • Scott Shambaugh (9)

  • Sheila-nk (2) +

  • Mauro Silberberg (3) +

  • Maciej Skorski (1) +

  • Laurent Sorber (1) +

  • Albert Steppi (28)

  • Kai Striega (1)

  • Saswat Susmoy (1) +

  • Alex Szatmary (1) +

  • Søren Fuglede Jørgensen (3)

  • othmane tamri (3) +

  • Ewout ter Hoeven (1)

  • Will Tirone (1)

  • TLeitzbach (1) +

  • Kevin Topolski (1) +

  • Edgar Andrés Margffoy Tuay (1)

  • Dipansh Uikey (1) +

  • Matus Valo (3)

  • Christian Veenhuis (2)

  • Nicolas Vetsch (1) +

  • Isaac Virshup (7)

  • Hielke Walinga (2) +

  • Stefan van der Walt (2)

  • Warren Weckesser (7)

  • Bernhard M. Wiedemann (4)

  • Levi John Wolf (1)

  • Xuefeng Xu (4) +

  • Rory Yorke (2)

  • YoussefAli1 (1) +

  • Irwin Zaid (4) +

  • Jinzhe Zeng (1) +

  • JIMMY ZHAO (1) +

总共有 163 人为此版本做出了贡献。有“+”标记的人是第一次提交补丁的贡献者。此名单是自动生成的,可能不完全。

1.12.0 版本的已关闭问题

  • #2725: 重心插值应允许导数的评估

  • #4244: betaincinv 准确性

  • #4677: scipy.special.btdtri 出现意外行为

  • #4819: 稀疏矩阵无法使用比较运算符重载

  • #5022: bicg 返回最后迭代,而不是最小残差向量

  • #6198: Krylov 方法的回调

  • #7241: 增强:实现 Chandrupatla 根查找算法(更简单/更快…

  • #8792: 当 Hessian 是 scipy.sparse 类时,Newton-CG 抛出错误

  • #9527: Anderson-Darling ksamples 无法估计给定…的 p 值

  • #11516: 建议在贡献者文档中使用 ccache 进行基准测试

  • #12017: 在 scipy.optimize.nnls 中暴露 FACTOR 参数,而不是使用魔数

  • #12748: GMRES 收敛问题

  • #12796: BUG:betaincinv、btdtri、stats.beta.ppf 中的非单调性

  • #13306: griddata 多个数据值

  • #13437: 文档:添加使用 solve_ivp 解决复杂问题的示例…

  • #14037: 增强:随机抽样的其他质量指标

  • #14480: LSODA 实现的密集输出产生错误结果

  • #15676: 增强:实现 multivariate_normal.fit

  • #15738: DEP:更改 scipy.sparse.linalg.* 中 atol 的默认值

  • #16729: _fitpack / dfitpack 重复

  • #16880: 增强:添加 Rotation.align_vector

  • #17290: 增强:在 Scipy 中添加多维 Wasserstein/Earth Mover 距离

  • #17398: BUG:scipy.optimize.differential_evolution 的文档…

  • #17462: 增强:通过对齐主轴和最佳拟合…创建 Rotations

  • #17493: BUG:stats:偶尔失败 levy_stable 的一些测试

  • #17572: BUG:弃用警告提示使用不存在的符号

  • #17706: 增强:添加等渗回归

  • #17734: BUG: dijkstra 算法在 v1.10... 中返回不同结果

  • #17744: BUG: 在 riscv 上 test_maxiter_worsening[lgmres] 测试失败

  • #17756: DOC: directed_hausdorff 中的维度澄清

  • #17771: BUG: 无法从 scipy.integrate 导入 ODEintWarning

  • #17864: ENH: 在 scipy bfgs 中初始化 Hessian 估计的功能请求

  • #17890: ENH: 第二类 Stirling 数

  • #18093: BUG: 大数值情况下熵计算失败

  • #18279: BUG: 对私有 API 的弃用警告误导性

  • #18316: DOC: 更新 scipy.stats.truncnorm.rvs 的示例

  • #18389: BUG: Yeo-Johnson 功率变换器产生 Numpy 警告

  • #18404: ENH: 添加 LAPACK 函数 stgsyldtgsyl 的包装器

  • #18432: BUG: levy_stable.pdf 未使用 pdf_default_method_name 属性

  • #18452: BUG: 使用 norm=”ortho” 的 DST 2 和 3 不正交

  • #18457: DOC: 澄清 prewitt 滤波器不返回幅度...

  • #18506: BUG: scipy.stats.hypergeom.sf 函数与... 的奇怪行为

  • #18511: BUG: 错误的超几何均值计算

  • #18564: BUG: 当下界无限时 rv_discrete 失败

  • #18568: BUG: circe-ci eigenvalue-LOBPCG 基准测试未检查准确性...

  • #18577: DEP: 弃用 sparse.gmres 中的位置参数

  • #18578: DEP: 弃用 stats.kendalltau 中的位置参数

  • #18579: DEP: 弃用 firwin* 中的位置参数

  • #18580: DEP: 移除 scale=’raw’iqr 中的使用

  • #18581: DEP: 移除 stats.binom_test

  • #18582: DEP: 移除 stats.qmc.LatinHypercube 中的 centered 参数

  • #18592: 稀疏数组创建函数的语义

  • #18637: BUG: 使用 python 3.11 创建 Anaconda 环境失败

  • #18639: ENH: multivariate_normal.rvs 的运行极慢

  • #18643: 文档:randint 描述中的问题

  • #18647: 错误:dgbmv 给出“(len(x)>offx+(trans==0?m-1:n-1)*abs(incx))…

  • #18651: 文档:Lomb-Scargle 周期图中方程式缺失等号

  • #18669: 文档:稀疏文档中的“matrix”和“array”混淆

  • #18680: stats:TestFit 中 XSLOW 测试失败

  • #18702: 弃用:弃用接近的别名积分方法…

  • #18721: 测试:test_linsolve.py 测试失败的原因

  • #18748: [文档] boxcox_normmax 参数 method=”mle” 的文档字符串不正确…

  • #18836: 文档:API 参考没有指向 interp1d 替代品的用户

  • #18838: 错误:stats.burr12:分布返回无效的矩

  • #18839: 增强功能:连接稀疏数组应返回稀疏数组

  • #18849: 错误:python dev.py bench 失败

  • #18860: 错误/性能测试:clough_tocher 基准测试失败

  • #18864: 错误:curve_fit 的记忆化导致函数中显著的开销…

  • #18868: CI/性能测试:错误时失败

  • #18876: 文档:integrate:澄清事件和 jac 必须具有相同…

  • #18881: 文档:lobpcg 示例改进

  • #18903: 文档:hacking.rst 中的链接返回到 hacking.rst 而不是它们的…

  • #18939: 增强功能:添加 Sakurai 和 Mikota 矩阵的新表示…

  • #18944: 如何更改使用 res.plot() 的默认设置

  • #18953: 错误:scipy.optimize._differentialevolution 错误地…

  • #18966: 错误:numpy/arrayobject.hPyArray_MAX 不再可用

  • #18981: 增强功能:发布 musllinux 到 PyPI 的 wheels

  • #18984: 文档:scipy.stats.lognorm — SciPy v1.12.0.dev 手册

  • #18987: 错误:_stats_pythran.cpython-311-x86_64-linux-gnu.so 中可复制的构建问题

  • #19008: 文档:scipy.integrate.DOP853 中的错误

  • #19009: 文档:Mann-Whitney… 参数 ‘alternative’ 上可能有拼写错误

  • #19024: 错误:#18481 使得 BFGS 最小化不够精确

  • #19039: 错误:stats.zscore 如果给定具有...

  • #19049: 测试:为 gh-17918 添加测试

  • #19056: 增强:添加计算选定数量 m 的极值特征对...

  • #19063: 文档:scipy.linalg.pinv.html 中的拼写错误

  • #19075: 增强:在相关优化中允许选择线搜索参数

  • #19082: 维护,发布:编程语言指令

  • #19090: 错误:root_scalar(牛顿方法),目标函数不一致...

  • #19092: 增强:更新 vendored SuperLU 版本

  • #19098: 增强:在 root_scalar 和 root 的 RootResults 中添加方法

  • #19102: 错误:least_squares 中使用 method=’trf’ 和初始参数...

  • #19117: 测试/维护:在 M1 macOS 上新构建时出现 AssertionError

  • #19118: 错误:不接受 np 可强制的数组类似物与数组...

  • #19140: 文档:stats:levy_stable 中的替代 loc-scale 处理

  • #19147: 错误:numpy 中移除了 asfarray

  • #19150: 从 pythran 的构建警告(?)

  • #19158: 错误:源代码存档具有虚假的时间戳

  • #19161: 增强:允许 sparse_matrix.transpose(axes=(1, 0))

  • #19167: 错误:构建图的非确定性

  • #19177: 测试:SphericalVoronoi 测试不对区域内敏感...

  • #19185: 错误:minimize_scalar 没有检查由边界指定的整个区域

  • #19188: 文档:KDTree 中的 1D 数组

  • #19190: 测试:在某些情况下跳过原因不正确,与数组 API 相关...

  • #19193: 文档:scipy.stats.Covariance 中的拼写错误

  • #19241: 错误:从 scipy.sparse.sputils 中的 utils 不可用...

  • #19273: 频率 w 的计算在 fs 默认时不准确...

  • #19276: 维护:数组类型:使 compliance_scipy 更加严格

  • #19332: 增强:帮助 skewnorm.fit 找到全局最小值

  • #19352: CI, BUILD: 使用 Cython 3.0.3 时的 SciPy 构建失败(已分析)

  • #19363: DOC: scipy.interpolate.griddata.html 中术语不一致

  • #19373: DOC: interpolate: 添加注释到 BarycentricInterpolator.add_xi…

  • #19396: BUG: L-BFGS-B 内存消耗异常高

  • #19398: BUG: test_filter_design.py 中缺少断言

  • #19406: CI, MAINT: NumPy 主版本/latest 存在已知的 CI 问题

  • #19442: BUG: 由于参数化不一致导致收集测试失败…

  • #19448: DOC:fft: next_fast_len 在文档中的签名为空

  • #19490: MAINT: lint: inventory 检查失败

  • #19544: DOC/MAINT: refguide-check 出现错误

  • #19553: BUG: 测试套件泄漏文件描述符(`OSError: [Errno 24]…

  • #19565: DOC/DX: ‘需要的构建依赖项’中缺少 meson-python

  • #19568: DOC/DX: ‘从源码构建’中缺少 cd scipy

  • #19575: BUG: scipy.ndimage.watershed_ift 的成本数据类型太小…

  • #19577: Windows 构建问题与快速矩阵市场部分相关

  • #19599: ENH: 当乘积为稀疏数组时返回 NotImplemented

  • #19612: ENH: differential evolution 中添加最佳成本函数评估

  • #19616: BUG: 正态反高斯分布在数值上不稳定

  • #19620: _lib: test_warning_calls_filters 中的测试错误(由于 Python…)

  • #19636: DOC: scipy.optimize.minimize 中回调参数的文档问题

  • #19640: CI, MAINT: scipy-openblas32 的预发布任务失败

  • #19726: BUG: 1.12.0rc1: Windows 平台上由于宏冲突导致构建失败

  • #19747: BUG: scipy.stats.nbinom.logcdf 报错 IndexError

  • #19795: MAINT: SciPy 1.12.0 RC2 需要稳定的 Pythran 发布

  • #19804: MAINT/TST: 使用 pytest 8 时警告导致测试套件失败

  • #19852: CI, MAINT: Windows 3.11 CI 失败,文件访问问题

  • #19906: 错误:1.12.0rc2 中pip list输出为 SciPy 而不是 scipy

1.12.0 的 Pull 请求

  • #12680: 增强:统计学:添加非参数单样本分位数测试和置信区间

  • #14103: 文档:integrate:向示例添加复杂矩阵 DE 解决方案

  • #14552: 错误修复:修复 LSODA 插值方案

  • #17408: 增强:短时傅里叶变换(STFT)增强

  • #17452: 增强:为旋转添加__pow__运算符

  • #17460: 增强:新的 Rotation 方法 approx_equal()

  • #17473: 增强:统计学:多变量 Wasserstein 距离/EMD

  • #17495: 文档:Optimize:更新 DE 文档

  • #17542: 增强:扩展 Rotation.align_vectors()以允许无限权重…

  • #17697: 增强:special:改进不完全贝塔函数。

  • #17719: 增强:为优化._zeros_py.py 添加 Chandrupatla 算法…

  • #17722: 增强:添加 pava 和 isotonic_regression

  • #17728: 增强:实现 Rotation.from_davenport 和 Rotation.as_davenport

  • #17757: 文档:澄清directed_hausdorff方法的输入维度

  • #17955: 增强:向 stats.sampling 添加简化的快速数值反演

  • #18103: 增强:在scipy.special中添加 stirling2 函数

  • #18133: 错误修复:修复一些测试失败和 x=zeta 时的不良行为…

  • #18151: 增强:向 scipy.integrate 添加累积辛普森积分

  • #18156: 增强:添加 loggamma 熵方法

  • #18197: 增强:为 BarycentricInterpolator 添加导数

  • #18219: 弃用:integrate:除了 None 之外的initial值…

  • #18348: 增强:为单调函数的根添加私有函数

  • #18361: 增强:在multivariate_normal中添加fit方法

  • #18363: 增强:统计学:添加 Baumgartner-Weiss-Schindler 测试

  • #18376: 增强:CloughTocher2DInterpolator 多次与不同…

  • #18465: 增强:多变量 t 熵的渐近展开

  • #18470: ENH: stats.anderson_ksamp: 重新添加测试的排列版本

  • #18477: DOC: stats.truncnorm: 添加关于截断点的示例

  • #18481: MAINT: 可微分函数尊重浮点数宽度。关闭 #15602

  • #18488: MAINT:ENH:sparse.linalg: 在 Python 中重写迭代求解器,…

  • #18492: 添加 NdBSpline: n-维张量积 B 样条对象

  • #18496: ENH: 在 _differential_evolution.py 中加快 _select_samples

  • #18499: ENH: 大 a 和 b 的 beta 熵的渐近展开

  • #18544: ENH: sparse.linalg: 实现 matrix_power()

  • #18552: DOC: stats.laplace_asymmetric: 注意尺度之间的关系…

  • #18570: ENH:optimize: 在 Python 中重写 nnls

  • #18571: ENH: linalg: 添加 ?tgsyl 的包装器

  • #18575: REL: 将版本设置为 1.12.0.dev0

  • #18585: DOC: stats.rv_discrete: 注意默认方法不兼容…

  • #18586: ENH: 覆盖 rdist 分布的 sf 方法

  • #18587: DEP: signal: 弃用 cmplx_sort

  • #18589: DEP: 移除 stats.qmc.LatinHypercube 的 centered 参数

  • #18594: DOC: 更明确地示例使用 scipy.linalg.lu_factor

  • #18602: MAINT: stats.hypergeom.mean: 对大参数进行修正

  • #18606: ENH: 覆盖 Pearson3 分布的 sf 方法

  • #18609: TST: 更新稀疏数组的非线性测试

  • #18610: DEP: 移除已弃用的 binom_test

  • #18612: DEP: stats.iqr: 移除已弃用的 scale='raw'

  • #18613: BUG: 修复 DST 类型 2/3 中的正交模式

  • #18614: MAINT: 不要覆盖 loguniform/reciprocal 分布的 sf 方法

  • #18616: ENH: 覆盖 loglaplace 分布的 sf 方法

  • #18617: MAINT: interpolate: 删除重复的 FITPACK bisplev 接口

  • #18620: MAINT: signal: 避免在 hilbert2 中使用 eval/exec

  • #18622: MAINT: 将 rvs_ratio_uniforms 移动到 sampling

  • #18624: DEP: 调整位置参数的弃用

  • #18631: 增强:在 scipy.io 中添加 fast_matrix_market

  • #18633: 错误修复:修复问题 levy_stable.pdf

  • #18640: 维护:在 _traversal.pyx 中修复 lint 警告

  • #18641: 增强:将 _covariance 设为缓存属性

  • #18649: 弃用:scipy.stats.morestats:澄清弃用警告

  • #18652: 错误修复:修复 linalg.blas.?gbmv… 的参数 x 的长度

  • #18653: 文档:Lomb-Scargle 周期图方程中添加丢失的等号

  • #18661: CI:在 CirrusCI 上更新 SCIPY_NIGHTLY_UPLOAD_TOKEN

  • #18664: 增强:stats.dirichlet:添加协方差方法

  • #18666: 维护:更新 environment.yml,移除 setuptools

  • #18667: 开发:在 environment.yml 中添加 Windows 特定说明

  • #18668: 增强:添加支持 Array API 的机制

  • #18670: 维护:signal:删除重复的 *ord 函数

  • #18677: 测试:linalg:改进某些测试的种子设定…

  • #18679: 维护:stats:Cythonize 并移除 Fortran statlib 代码

  • #18682: 测试:stats:修复 xslow 测试失败

  • #18686: 开发:在 macOS 上添加运行内存基准测试的能力

  • #18689: CI:使用 Python 3.12-beta 进行测试

  • #18690: 文档:提及 genlogistic 是几种类型之一…

  • #18692: 维护:signal:用更合理的方式替换 np.r_[“-1”, arrays]

  • #18694: 文档:signal:更新 Chebyshev 2 文档

  • #18695: 增强:为自由参数重写 halflogistic fit

  • #18696: 维护 修复 scipy.optimize._differentialevolution.py 中的损坏链接

  • #18699: 弃用:整合:弃用旧的别名

  • #18705: 维护 优化 scipy.optimize._differentialevolution.py 中的链接

  • #18706: 文档:linalg:各种文档改进

  • #18708: 维护:信号/dlsim:避免使用 interp1d;改用 make_interp_spline…

  • #18710: 维护:移除 np.r_[“-1”, …]

  • #18712: 维护:提升支持的最小 NumPy 版本至 1.22.4

  • #18713: 维护:修复 _fitpack_impl.py 中的检查器错误

  • #18714: 增强:当一个参数较大时改进 beta 熵

  • #18715: 维护:signal:删除重复的 _atleast_2d_or_none

  • #18718: 测试:将 lsq_linear 的两个测试标记为 xslow

  • #18719: 维护:optimize._chandrupatla:修复结果对象问题

  • #18720: 文档:修正 _lbfgsb_py.py 中的符号变化:“pg_i” 和 “proj…

  • #18723: 维护:sparse.linalg:使用 _NoValue 替代不推荐的关键字参数

  • #18726: 增强:改进带有固定参数的 halflogistic 分布拟合

  • #18727: 维护:在 PR 模板中添加跳过 CI 的链接

  • #18728: 维护:optimize._chandrupatla:重构以复用代码

  • #18729: 文档:添加关于 weibull_min 与标准指数分布的连接说明

  • #18734: 维护:更新 codeowners

  • #18742: 增强:differential_evolution 回调接受中间结果

  • #18744: 测试:sparse.linalg:放宽 test_hermitian_modes 的容差

  • #18746: 维护:向前移携 1.11.0 发行说明

  • #18755: 增强:为 Burr 分布重写 isf

  • #18756: 文档:stats.boxcox_normmax:修正 minimize -> maximize

  • #18758: 文档:关于 scipy.sparse.random 的性能突变说明

  • #18760: 增强:重写 halfnorm 拟合

  • #18764: 增强:stats:在 boxcox_normmax 中添加信息性错误消息…

  • #18771: 修复来自 #18758 的拼写错误

  • #18777: 文档:澄清 Prewitt 滤波器

  • #18783: 增强:stats:为 hypsecant 实现 _sf 和 _isf

  • #18786: 维护:向前移携 1.11.1 发行说明

  • #18794: 维护:修复 halflogistic.fit 因位置猜测错误而失败

  • #18795: 错误、文档:更正 adsurl 值并添加通用的 url

  • #18799: 增强:简化 gausshyper.pdf

  • #18802: 维护:内部使用 sparse.diags 替代 spdiags

  • #18803: 维护:rv_discrete 在重复的 xk 中应引发异常

  • #18807: ENH: 删除不必要的根查找函数从偏态正态分布

  • #18808: TST: 为 gh-18800 添加测试

  • #18812: DEP: 线性代数:对于 pinv {,r}cond,加强弃用警告

  • #18814: DOC: 更新 Windows 指南并移动 conda/mamba

  • #18815: ENH: 统计:为 loglaplace 添加 _isf 方法

  • #18816: ENH: 统计:为 lognorm 添加 _isf 方法

  • #18817: DOC: 修正 randint 描述中的示例

  • #18818: MAINT: 简化 codespaces 环境激活

  • #18819: TST: stats.dgamma.pdf: 调整间歇性失败的测试

  • #18820: ENH: 统计:为 pareto 添加 _isf 方法

  • #18822: ENH: 统计:为 kappa3 添加 _sf 和 _isf 方法

  • #18823: ENH: 统计:为 lomax 添加 _isf 方法

  • #18824: ENH: 覆盖 halfcauchy 分布拟合

  • #18826: DEP: 线性代数:对 eigh/eigvalsh 的位置参数使用 _NoValue

  • #18829: ENH: 优化:单变量函数的向量化最小化

  • #18830: DOC: 在导入指南中软化措辞,提及延迟加载

  • #18833: ENH: 优化:在计算最小成本配对问题时释放全局解锁

  • #18835: DEP: scipy.stats.stats: 澄清弃用警告

  • #18840: MAINT: 修正 stats.burr12:当 c*d <= order 时,矩未定义

  • #18841: MAINT: sctype 替换 NumPy 2.0

  • #18843: DEP: 采用 sklearn 的机制来弃用位置传递 kwargs

  • #18846: MAINT: 减少 signal.rst 中包含的 SVG 文件大小

  • #18847: MAINT: NumPy 2.0 中 ptp 没有方法

  • #18848: ENH: 在 show_config 输出中添加编译和链接参数

  • #18850: ENH: 改进 SphericalVoronoi 面积计算性能

  • #18852: BUG: 修复 stats.yeojohnson 中的溢出问题

  • #18853: BENCH: 移除阶乘基准测试

  • #18854: MAINT: 信号:简化 lsim 中的符号

  • #18856: MAINT: 移除更多 runtests.py 的内容

  • #18858: MAINT: 在 cluster.hierarcy 中清理视图/步幅/数据类型实用程序

  • #18861: MAINT: 避免np.deprecatenp.core,添加normalize_axis_index...

  • #18862: ENH: hstack、vstack、bmat、block_diag 的稀疏数组。新...

  • #18863: DEP: 删除额外的 np.deprecate 并重新添加文档

  • #18872: DOC: 添加 Fisk(对数-逻辑)与逻辑之间的关系。

  • #18873: DOC: 添加更多的交叉编译细节

  • #18885: DOC: 安装命令中的小问题

  • #18886: MAINT/DOC: 清除 ndimage 中的文档字符串问题

  • #18887: DOC: 根据相同标签使用sync语句进行制表符同步

  • #18888: MAINT: 设置 Codespaces 的 RAM 要求

  • #18889: CI: 添加带 64 位 OpenBLAS 夜间构建的预发布版本

  • #18893: ENH: 随机采样的几何质量指标

  • #18898: DOC: 修复稀疏文档中“矩阵”和“数组”混淆问题

  • #18905: DOC: 澄清 f 分布注释中的自由度

  • #18910: DOC: 从 CONTRIBUTING.rst 链接到 SciPy 网站

  • #18911: DOC/MAINT: special文档修复

  • #18914: ENH: 通过添加查询 PYTHONPATH 的命令增强 dev.py

  • #18916: DEP: stats: 改进私有但存在的模块的废弃

  • #18917: ENH: 将{c, q}spline_1d 转换为使用 sosfilt/lfilter

  • #18920: DOC: 在 csgraph 中指示具有多个有效解的函数

  • #18927: TST: 使用 Hypothesis 进行基于属性的测试

  • #18929: ENH: 将稀疏 dok 从 dict 的子类更改为具有属性...

  • #18930: ENH: _lib._util: 使 _lazywhere 兼容 Array API

  • #18931: MAINT: 清理对vonmises.fit的冗余测试

  • #18932: DEP: 废弃 signal._fir_f 中某些方法的位置参数...

  • #18933: DEP: 废弃 special.comb 的位置参数

  • #18934: DEP: 废弃 sparse.linalg 中某些方法的位置参数

  • #18935: DEP: 废弃 linalg.pinv 的位置参数

  • #18936: DEP: 弃用 stats.kendalltau 的位置参数

  • #18942: CI: 更改 OpenBLAS 每夜版的 wheel 位置

  • #18943: DEP: sparse.linalg: 弃用 gcrotmk 的位置参数…

  • #18946: DEP: linalg: 弃用 eigh/eigvalsh 的位置参数

  • #18948: ENH: Jones 和 Faddy Skew-T 分布

  • #18949: DOC: stats.FitResult.plot: 添加示例

  • #18952: MAINT: 删除 ._is_array,因为现在有: `isinstance(x,…

  • #18954: BENCH: 更新/重写 lobpcg 基准 sparse_linalg_lobpcg.py

  • #18955: MAINT/DOC: 空间:文档和测试双覆盖属性…

  • #18958: MAINT: optimize.differential_evolution: 澄清边界必须…

  • #18962: 更新覆盖操作的名称

  • #18963: ENH: sparse.linalg: 添加 LaplacianNd 类到特殊稀疏数组

  • #18967: MAINT: 重新定义 PyArray_MAX/PyArray_MIN 因为它们…

  • #18968: DEP: 优化:改进私有模块的弃用未命名…

  • #18970: DEP: integrate: 改进私有模块的弃用命名…

  • #18973: MAINT: linalg: 移除一个杂项 np.cast

  • #18975: ENH: 将 scipy 改为使用新的 numpy 复数类型

  • #18977: ENH: 将 scalar_search_wolfe 的 c1 和 c2 暴露给 fmin_bfgs

  • #18986: ENH: 添加多元正态分布中固定参数的可能性…

  • #18992: DEP: 插值:改进私有模块的弃用命名…

  • #18995: DOC: stats.lognorm: 添加正态分布之间关系的示例…

  • #18996: ENH: optimize.curve_fit: 减少轻量级记忆化的开销

  • #18997: DOC: 在 cython_optimize 文档中添加 noexcept

  • #19000: MAINT: fft: 将 test_numpy.py 重命名为 test_basic.py

  • #19005: ENH: fft: 支持数组 API 标准

  • #19007: BLD: 将 venv 添加到 .gitignore

  • #19010: DOC/MAINT: typo: 将 Azure 的引用改为 Cirrus

  • #19012: DOC: stats.mannwhitneyu: 处理表面上的符号不一致性...

  • #19013: DOCS: 修正 _fitpack2.py 中的拼写错误

  • #19014: MAINT: 复制,与数组 API 兼容的实用函数

  • #19015: ENH: 更新 numpy 异常导入

  • #19018: TST/BUG: 修复数组 API 测试跳过装饰器

  • #19023: ENH: special: 调度到数组库

  • #19030: MAINT: 用argparse替换optparse的使用

  • #19033: MAINT: 修复 codespaces 的 setup.sh 脚本

  • #19035: DEP: linalg: 改进未命名私有模块的弃用...

  • #19045: MAINT: 更改add_newdoc的导入并删除NINF

  • #19047: 修正类 DOP853 的 docstring 中的语法错误

  • #19050: CI/BLD: 制作夜间轮子,每天关闭#19048

  • #19051: ENH: 与数组无关的cov,用于cluster

  • #19052: BENCH: 更新 asv,在错误时失败基准 CI,修复后果

  • #19053: CI: cirrus 的修改

  • #19055: MAINT: 在cluster中使用来自#19014 的copy实用程序

  • #19057: ENH: 添加计算选定数量 m 的极端特征对...

  • #19060: MAINT: 从 Fortran 移植 minpack2.dcsrch 到 Python,删除 Fortran...

  • #19061: DOC: 将 NaN 拼写为 nan

  • #19062: BLD: 在 SuperLU 中用singlecomplex替换复杂的出现

  • #19064: TST: 将TestTruncexpon.test_is_isf的容差提升一点

  • #19066: 更新 dfovec.py 案例 20 以进行零索引

  • #19067: DEP: 删除所有弃用的scipy.<numpy-func>对象

  • #19070: DEP: odr: 改进私有模块的弃用

  • #19073: DOC: 删除不再导入的 numpy 函数的引用

  • #19074: TST: 为 sqrtm 意外转换为...添加回归测试

  • #19078: ENH: 反映来自 numpy 命名空间重构第三部分的更改

  • #19081: ENH: optimize: scalar_search_wolfe 的 c1 和 c2 到 cg 和 newton-cg 的优化

  • #19083: MAINT: 正向移植 1.11.2 版本的发布说明

  • #19086: 构建:在 pyproject.toml 中调整构建依赖和 3.12 分类器

  • #19087: 文档:添加有关在基准测试中使用 ccache 的信息

  • #19089: 文档:在solve_ivp的参数上添加注释(#18876)

  • #19091: 维护:optimize.root_scalar:在使用牛顿法时处理参数…

  • #19093: 维护:stats.zscore:在第 0 个元素是时返回正确的结果…

  • #19094: 错误修复:optimize:更新不正确的 c1 值

  • #19095: 增强:optimize:在 BFGS 中添加逆 Hess 估计

  • #19100: 维护:将trapezoid实现移到 SciPy 中

  • #19104: 维护:修复 CT 子类的基准测试

  • #19110: 维护:移除np.row_stacknp.in1d的用法

  • #19113: 维护、测试:对 default_rng 进行少量测试

  • #19115: 增强、测试:在文档示例中使用显式导入

  • #19127: 文档:linalg:修正 pinv 文档中的拼写错误

  • #19128: 增强:optimize:在 root_scalar 的结果对象中添加 method 属性…

  • #19129: 文档:添加示例到combine_pvaluesfhtoffset

  • #19136: 维护:移除 NumPy 的 infty 别名

  • #19141: 维护:更多的 NumPy API 桥接

  • #19143: 维护:移除 asfarray 的使用

  • #19146: 文档:sparse.linalg:通过更新的方式增强 lobpcg 文档…

  • #19152: 文档:修复前任打字错误。

  • #19157: 测试:添加与数组无关的断言

  • #19162: 增强:允许sparse_mtx.transpose(axes=(1, 0))

  • #19165: 弃用:改进常量模块的弃用警告

  • #19166: 维护:反映从numpy命名空间重构部分的更改

  • #19168: 构建:special 模块:修复_ellip_harm_2的依赖关系

  • #19170: 维护:修复 Cython 代码中的一些问题

  • #19171: 增强:稀疏数组的构造函数

  • #19172: 维护:简化球面 Voronoi 排序

  • #19173: 维护:improve._tanhsinh:进一步测试后的改进

  • #19175: DOC:stats:修正 levy_stable 的 loc-scale 注释。

  • #19178: MAINT/DOC:在文档中的多元正态方法中添加 fit。

  • #19179: DOC:为 tf2zpk 函数添加示例。

  • #19183: MAINT:从 rec 导入 fromarrays。

  • #19184: TST:修复稀疏构造函数测试的大内存占用问题。

  • #19186: TST:_lib:改进 array API 断言。

  • #19187: BUG:接受可转换为 np 数组的 array-like 对象,并带有 array API 标志...

  • #19191: BLD:更新 meson-python 和 pythran 的最低版本要求。

  • #19192: TST:测试容差调整以修复报告的失败。

  • #19194: BUG/TST:为 cupy 修复 test_array_api。

  • #19195: DOC:修正 scipy.stats.Covariance 中的拼写错误。

  • #19198: DOC:optimize.minimize_scalar:注意限制并建议替代方案。

  • #19201: DOC:缺少反引号。

  • #19202: DOC:删除对 Python 2 的旧提及。

  • #19203: DOC:修正 _nan_allsame 示例的提示。

  • #19204: DOC:mannwhitneyu 中缺少(和漫无目的的)反引号。

  • #19206: TST, MAINT:跳过对 array API 测试的修复。

  • #19217: BLD:开始针对 numpy 2.0 构建轮子。

  • #19218: DOC:为 zpk2tf、tf2sos、sos2tf、lp2lp_zpk、lp2hp_zpk 等添加示例。

  • #19219: ENH:为 DifferentialEvolution 实现自定义变异/交叉函数。

  • #19222: DOC:澄清对样式修改的指导方针。

  • #19224: BUG:integrate:暴露 ODEintWarning。

  • #19226: DEP:改进对 sparse 私有 API 的弃用消息。

  • #19227: DOC:闭合反引号后的尾随字符。

  • #19229: DOC:修复 dev.py 中重复的拼写错误。

  • #19233: DOC:修正尾随反引号后的字符。

  • #19236: BUG:从 all 中移除已删除的项目。

  • #19237: DOC:_nan_allsame 函数文档中缺少导入。

  • #19240: DEP:spatial:改进私有模块的弃用,不包括...

  • #19243: 文档:stats:修复由 pearsonr 引发的警告文档

  • #19244: 维护:scipy.io NEP 50 shims

  • #19247: 维护:移除 NumPy 版本检查

  • #19251: 测试/维护:cluster:使用新的数组 API 断言

  • #19253: 维护:清理过期的 ndarray 方法

  • #19256: 文档:为 correlation、num_obs_dm、num_obs_y 函数添加示例

  • #19259: 文档:概述当 BFGS 中发生精度损失时的解决方法【跳过...】

  • #19261: 维护:fft:用_execute_1D重构基本后端

  • #19262: 维护:fft:清理测试跳过

  • #19263: 增强:fft:GPU 支持非标准基本变换

  • #19264: 维护/测试:fft:删除重复的命名空间和 dtype 检查

  • #19265: 维护:数组 API:重命名arg_err_msg并移至_lib

  • #19266: 增强:在 _minimize_newtoncg 中使用原地加法

  • #19267: 维护:在_minimize_newtoncg中使用 linalg.norm

  • #19270: 维护:在 Cephes 代码中修复-Wdeprecated-non-prototype 警告

  • #19271: 文档:为ndimage.shift添加示例

  • #19275: 维护:为numpy.core重命名添加警告过滤器

  • #19278: 文档:使用np.copysign()而不是np.sign()

  • #19281: 文档:将fft添加到支持数组 API 的模块列表中

  • #19282: 维护:fft:清理断言

  • #19284: 增强:将 SuperLU 更新至版本 6.0.1

  • #19285: 维护:修复更多-Wdeprecate-non-prototype警告

  • #19287: 增强:为 stirling2 添加 exact=False 支持

  • #19289: 构建:stats:改进unuran_wrapper的构建配置

  • #19293: 维护:optimize._bracket_root:重构并添加注释以提高清晰度

  • #19294: 维护:用 OSError 替换 IOError 别名

  • #19295: 文档:修复 codespell 发现的拼写错误

  • #19296: 维护:修复代码检查问题

  • #19298: 维护:用内置的 open 替换 io.open 别名

  • #19302: 维护:修复/参数化旋转测试。

  • #19304: 文档:修复 ks_2samp 参考中的页面错字

  • #19310: 维护:移除 np.int_np.uint

  • #19311: 文档:无效的解释文本(闭合反引号后缺少空格)。

  • #19312: 文档:杂项格式错误。

  • #19313: 文档:在 CPP 代码中的行末添加新行。

  • #19314: 文档:Rst 不喜欢没有空行的列表。

  • #19315: 维护:向前移植 1.11.3 版本说明

  • #19317: 维护:移除使用 setup.py 构建的支持

  • #19327: 增强:为 skewnorm 添加一个数值稳定的 logpdf 函数…

  • #19331: 维护,BLD:更多的 setup.py 清理工作

  • #19333: 增强:更加稳健地用 MLE 拟合 skewnorms

  • #19340: 废弃:废弃 scipy.signal 的小波

  • #19341: 维护:移除剩余的 numpy.int_ 和过滤 np.long

  • #19346: 维护:stats:修复 differential_entropy 过小的错误行为

  • #19347: 修复:修复 stats.truncpareto 中的 ValueError

  • #19349: 维护:修复 scipy.signal 的 shims 导入

  • #19350: 增强:stats:添加对掩码数组、nan_policy 和…

  • #19358: 测试:SphericalVoronoi 区域类型

  • #19360: BLD,维护:更多的构建系统清理工作

  • #19367: CI:避免使用 Cython 3.0.3

  • #19371: 增强:stats.ansari:增加轴 / nan_policy / keepdims 支持

  • #19376: 测试:增加 test_al_mohy_higham_2012_experiment_1 的容差

  • #19380: 开发/CI:在 dev.py 和一些 CI 作业中使用 scipy-openblas32 wheels

  • #19385: 增强:贝塔负二项分布

  • #19390: 文档,维护:更多的 distutils/build 清理工作

  • #19391: 维护:空间:更改 KDTree 中的错误消息以提供更多信息。

  • #19392: 增强:stats.bartlett:增加轴 / nan_policy / keepdims 支持

  • #19394: 维护:部分撤销 np.int_ 的更改

  • #19395: 废弃:ndimage:改进未命名的私有模块的废弃警告

  • #19399: 测试:signal:在 test_filter_design.py 中添加丢失的断言

  • #19402: 维护:l-bfgs-b 移除中间边界数组

  • #19409: 维护:修复使用 GCC 13 时的 C++ 构建错误

  • #19410: 文档:插值:添加 BarycentricInterpolator.add_xi 的注意

  • #19412: 增强:stats:为环形统计添加对掩码数组的支持…

  • #19414: 构建:使用 scipy-openblas 替代 with-scipy-openblas

  • #19419: 增强:SphericalVoronoi 排序加速

  • #19422: 文档:修正微小的拼写错误。

  • #19425: 增强:stats:添加对掩码数组、轴元组和 nan 策略的支持…

  • #19426: 维护:更新 fft.helper 导入

  • #19428: 增强:stats.levene/fligner:添加对轴 / nan_policy / keepdims 的支持

  • #19429: 文档:修正 scipy.optimize.minimize 回调函数签名的文档

  • #19431: 维护:增加 NEP 50 的兼容性层

  • #19433: 文档:为 stats.hdquantiles 添加示例

  • #19435: 维护:将 lambertw_scalar 翻译为 C++

  • #19439: 构建:更新 pyproject.toml 中的构建依赖版本

  • #19440: 文档:删除 spline_filter 文档字符串中的未使用参数

  • #19443: 测试:最小化修复 #19442

  • #19445: 测试:移除一些不必要的元组转换

  • #19449: 文档/维护:fft:修正 next_fast_len 的签名

  • #19453: 添加括号以准确计算频率 w when…

  • #19458: 文档:空间旋转文档更新

  • #19461: 文档:开发:将最大行长度更新为 88 字符

  • #19465: 文档:修复损坏的 NetCDF 链接

  • #19466: 维护:NumPy int 类型的兼容性层

  • #19469: 废弃:special:改进未命名的私有模块的废弃警告…

  • #19471: 维护:将二项式分布翻译为 C++

  • #19472: 维护:更新 fast_matrix_market 至 1.7.4

  • #19482: 维护:根据 scipy::special 中的标志条件使用 sf_error

  • #19483: 增强:为 NearestNDInterpolator 添加最大距离

  • #19484: CI:限制 scipy-openblas32 轮子版本为 0.3.23.293.2

  • #19487: 增强:stats.cramervonmises/epps_singleton:添加轴/ nan_policy…

  • #19489: 维护:lint:按子包忽略 E501(行长度)

  • #19491: 维护/风格:杂项:移除 E501(行长度)的 lint 忽略

  • #19494: 维护/风格:conftest.py:移除 E501(行长度)的 lint 忽略

  • #19495: 维护:摆脱 Python 2 遗留问题

  • #19497: CI:添加‘[仅 lint]’,‘[仅文档]’跳过标签

  • #19501: 测试:跳过 test_bootstrap_against_theory

  • #19503: 维护/风格:fftpack:移除 E501(行长度)的 lint 忽略

  • #19505: 维护/风格:scipyoptdoc.py:移除 E501(行长度)的 lint…

  • #19506: 维护:稀疏:更新测试以切换格式和转为数组从…

  • #19507: 维护/文档:统计:修复 lint 错误

  • #19508: 维护/文档/基准:优化:修复 linter 错误

  • #19509: 维护:修复剩余的 lint 错误

  • #19510: DEP:整合:弃用 romberg 和 quadrature

  • #19514: 维护/风格:odr:移除 E501(行长度)的 lint 忽略

  • #19515: 维护:重构 extra_special(工作名称)作为内部库

  • #19516: 维护:lint:启用 UP 规则

  • #19519: 文档:修复在统计教程中使用的示例

  • #19520: 维护/风格:fft:移除 E501(行长度)的 lint 忽略,noqa

  • #19523: 维护/风格:常数:移除 E501(行长度)的 lint 忽略

  • #19525: 文档,CI:参考指南可能会有变化

  • #19527: 文档,维护:更多参考指南修复

  • #19529: 维护:全面 noqa 评审

  • #19533: 文档:通过 codespell 发现更多拼写错误

  • #19534: 维护:去掉更多的 Python 2 遗留问题

  • #19540: 文档:_binomtest.py:添加更清晰的错误消息

  • #19546: 维护:修正 interpolate.make_smoothing_spline 中的大小验证…

  • #19556: 文档:撤销 bcbb18f 的一部分 / #19533

  • #19558: 维护:前向端口 1.11.4 发布说明

  • #19562: 维护:修正 Rotation.from_mrp 中引用的论文中的拼写错误

  • #19564: 维护:在 .gitignore 中标记目录而不是它们的…

  • #19570: 文档:修正 index.rst 中的构建说明(#19568)

  • #19574: 文档:更新构建来源文档以进行可编辑安装

  • #19576: 错误修复:在 NI_WatershedElement 中使用 uint32 作为成本类型

  • #19578: 错误修复:stats._axis_nan_policy_factory:在检测时尊重 too_small…

  • #19579: 构建/维护:更新 dev.py 消息

  • #19581: 错误修复:interpolate/ndbspline:修复 len(tx) != len(ty) 时的越界访问…

  • #19583: 增强:使用 np.dot 加快 spatial.distance.correlation 的计算速度

  • #19585: 废弃:改进已命名但仍未删除的私有模块的弃用…

  • #19588: 构建:在快速矩阵市场中添加丢失的 cstdin 包含

  • #19589: 增强:使用 np.dot 加快 spatial.distance.hamming 的计算速度

  • #19590: 维护:special:为 Cython 签名添加更多 noexcept

  • #19591: 维护:插值/RGI:避免不必要的数据验证…

  • #19593: 在与稀疏数组的比较中返回 NotImplemented

  • #19597: 测试:special._sinpi/_cospi:跳过失败的 test_intermediate_overflow

  • #19600: 修复稀疏矩阵乘法

  • #19601: 增强:使特殊的 C++ 实现能在 CUDA 上(及更高版本)工作

  • #19603: 文档:eig 标准化的文档修正

  • #19604: 错误修复:修复 stats.boxcox_normmax 中 method=’mle’ 时的溢出问题

  • #19606: 维护:数组类型:限制为布尔和数值数据类型

  • #19608: 维护/文档:修正参考指南检查

  • #19609: 维护:lint:启用整个包的行长度检查

  • #19611: 文档:澄清插值器术语

  • #19613: 维护:为特殊的 C++ 文件添加 clang-format 格式化

  • #19617: 修复数值稳定性

  • #19618: MAINT: QMC 排列类型的优化

  • #19622: CI: 取消对 32 位 Linux 作业中 cython==0.29.35 的固定,并移除…

  • #19623: MAINT: lint:启用 stacklevel 警告检查

  • #19624: MAINT/TST: _lib:使用值而不是废弃的 s

  • #19626: MAINT: 更多的 SciPy Windows 整数兼容层

  • #19628: DOC: 1.12.0 发布说明

  • #19635: MAINT: 简化 Nakagami 分布的均值计算

  • #19637: DOC: 在 integrate 教程中澄清积分误差界限

  • #19648: MAINT: 简化卡方分布的均值计算

  • #19651: MAINT: stats.entropy:消除 mypy 的警告

  • #19656: BUG: 移除不相关类型的不必要的 incref

  • #19658: MAINT: git blame 忽略以进行代码风格清理

  • #19660: STY: special: 使用 clang-format 的缩进宽度为 4

  • #19661: CI: 通过正确的版本固定修复预发布作业对 scipy-openblas32

  • #19670: MAINT: 1.12.0rc1 版本界限

  • #19677: DOC: 数组类型:在 special 中提及部分支持

  • #19686: TST: 修复 signal.sosfilt 测试中的错误

  • #19690: BLD: 避免在 oneAPI 编译器中使用 fast-math,修复处理…

  • #19691: BUG: 修复 stats.boxcox_normmax 中的负溢出问题

  • #19693: BUG: 防止在 spatial.distance.* 中改变 w 参数

  • #19702: DEP: 为 gcrotmk/lgmres/minres/tfqmr 也采纳 *tol 弃用

  • #19709: MAINT: 累积辛普森法的后续评论

  • #19735: DOC: 更新 1.12 版本发布说明中的所有弃用内容

  • #19748: TST: 跳过复数值的 RGI(..., method="pchip") 测试

  • #19751: BUG: 使 FMM 类成为 py::module_local(修复 1.12RC 版本)

  • #19761: MAINT: 避免在 Windows 上在 pocketfft 中使用 aligned_alloc

  • #19779: BUG: 修复无效输入的 nbinom.logcdf

  • #19785: BUG: 支持 Newton-CG 中的稀疏 Hessian 矩阵

  • #19797: MAINT: 准备 1.12.0rc2 版本

  • #19800: TST: 放宽测试容差,以避免在 Windows + MKL 上失败的测试

  • #19806: TST: 修复与 pytest 8 的兼容性问题

  • #19830: REL: 版权更新至 2024

  • #19842: TST: 将 test_real_transforms 的参考数据移至一个 fixture

  • #19859: BLD: 改进 scipy-openblas 的依赖检查

  • #19877: DOC: 调整 1.12 版本的发布说明

  • #19881: 撤销“ENH: stats.wasserstein_distance: 多变量瓦瑟斯坦...

  • #19892: DEP: 延长某些已公布的弃用期限,因为超出 1.13 版本...

  • #19903: DEP: 在发布说明中反映扩展的弃用情况

  • #19910: BLD: 确保安装的 scipy 包名称为小写

posted @ 2024-06-27 17:06  绝不原创的飞龙  阅读(9)  评论(0编辑  收藏  举报