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

67 阅读35分钟

SciPy 1.12 中文文档(二十七)

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

scipy.optimize.diagbroyden

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

scipy.optimize.diagbroyden(F, xin, iter=None, alpha=None, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)

查找函数的根,使用对角布罗伊登雅各比近似法。

雅各比近似法源自先前迭代,仅保留布罗伊登矩阵的对角线。

警告

这种算法可能对特定问题有用,但其是否有效可能严重依赖于问题本身。

参数:

Ffunction(x) -> f

要找其根的函数;应接受并返回类似数组的对象。

xinarray_like

解的初始猜测

alphafloat,可选

雅各比的初始猜测为(-1/alpha)。

iterint,可选

要进行的迭代次数。如果省略(默认),则进行足够多次迭代以满足容差要求。

verbosebool,可选

在每次迭代时将状态打印到标准输出。

maxiterint,可选

要进行的最大迭代次数。如果需要更多次迭代以满足收敛性,将引发NoConvergence

f_tolfloat,可选

残差的绝对容差(最大范数)。如果省略,默认为 6e-6。

f_rtolfloat,可选

相对残差的相对容差。如果省略,则不使用。

x_tolfloat,可选

绝对最小步长,根据雅各比近似法确定。如果步长小于此值,则优化将成功终止。如果省略,则不使用。

x_rtolfloat,可选

相对最小步长。如果省略,则不使用。

tol_normfunction(vector) -> scalar,可选

用于收敛检查的范数。默认为最大范数。

line_search{None, ‘armijo’(默认),‘wolfe’},可选

决定由雅各比近似给出的方向上的步长时,使用哪种类型的线搜索。默认为‘armijo’。

callbackfunction,可选

可选回调函数。在每次迭代时调用,参数为callback(x, f),其中x为当前解,f为对应残差。

返回:

solndarray

包含最终解的数组(与x0具有相似的数组类型)。

引发:

NoConvergence

当未找到解时。

另请参见

root

用于多元函数根查找算法的接口。特别查看method='diagbroyden'

示例

下面的函数定义了一个非线性方程组的系统。

>>> def fun(x):
...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
...             0.5 * (x[1] - x[0])**3 + x[1]] 

可以通过以下方式获得解决方案。

>>> from scipy import optimize
>>> sol = optimize.diagbroyden(fun, [0, 0])
>>> sol
array([0.84116403, 0.15883384]) 

信号处理(scipy.signal

原文链接:docs.scipy.org/doc/scipy-1.12.0/reference/signal.html

卷积

convolve(in1, in2[, mode, method])对两个 N 维数组进行卷积。
correlate(in1, in2[, mode, method])对两个 N 维数组进行交叉相关。
fftconvolve(in1, in2[, mode, axes])使用 FFT 对两个 N 维数组进行卷积。
oaconvolve(in1, in2[, mode, axes])使用重叠-加法方法对两个 N 维数组进行卷积。
convolve2d(in1, in2[, mode, boundary, fillvalue])对两个二维数组进行卷积。
correlate2d(in1, in2[, mode, boundary, ...])对两个二维数组进行交叉相关。
sepfir2d(input, hrow, hcol)使用二维可分离 FIR 滤波器进行卷积。
choose_conv_method(in1, in2[, mode, measure])查找最快的卷积/相关方法。
correlation_lags(in1_len, in2_len[, mode])计算 1D 交叉相关的滞后/位移索引数组。

B 样条曲线

bspline(x, n)B 样条基函数。

自版本 1.11.0 起已弃用。

|

cubic(x)三次曲线插值。

自版本 1.11.0 起已弃用。

|

quadratic(x)二次曲线插值。

自版本 1.11.0 起已弃用。

|

gauss_spline(x, n)高斯逼近的 B 样条基函数(n 阶)。
cspline1d(signal[, lamb])计算一维秩为 1 的三次样条插值系数。
qspline1d(signal[, lamb])计算一维秩为 1 的二次样条插值系数。
cspline2d(input[, lambda, precision])二维三次 B 样条的系数。
qspline2d(input[, lambda, precision])二维二次 B 样条的系数:
cspline1d_eval(cj, newx[, dx, x0])在新点集上评估一维三次样条。
qspline1d_eval(cj, newx[, dx, x0])在新点集上评估一维二次样条。
spline_filter(Iin[, lmbda])对二维数组进行平滑样条(三次)滤波。

Filtering

order_filter(a, domain, rank)在 N 维数组上执行阶次滤波。
medfilt(volume[, kernel_size])对 N 维数组执行中值滤波。
medfilt2d(input[, kernel_size])对二维数组进行中值滤波。
wiener(im[, mysize, noise])对 N 维数组执行维纳滤波。
symiirorder1(input, c0, z1[, precision])使用第一阶段级联实现具有镜像对称边界条件的平滑 IIR 滤波器。第二阶段使用反向序列。
symiirorder2(input, r, omega[, precision])使用第二阶段级联实现具有镜像对称边界条件的平滑 IIR 滤波器。第二阶段使用反向序列。
lfilter(b, a, x[, axis, zi])使用 IIR 或 FIR 滤波器沿着一维对数据进行滤波。
lfiltic(b, a, y[, x])给定输入和输出向量,构造 lfilter 的初始条件。
lfilter_zi(b, a)构造 lfilter 的初始条件,用于阶跃响应的稳态。
filtfilt对信号进行前向和后向数字滤波。
savgol_filter对数组应用 Savitzky-Golay 滤波器。
deconvolve使用逆滤波器将divisorsignal中去卷积出来。
sosfilt使用级联的二阶段沿着一个维度对数据进行滤波。
sosfilt_zi构造 sosfilt 的初始条件,用于步响应稳态。
sosfiltfilt使用级联的二阶段进行前向-后向数字滤波。
hilbert使用 Hilbert 变换计算解析信号。
hilbert2计算x的二维解析信号。
decimate在应用抗混叠滤波器后对信号进行下采样。
detrend从数据中沿着指定轴去除线性趋势。
resample使用傅里叶方法沿给定轴对x进行num样本的重采样。
resample_poly使用多相滤波器沿指定轴对x进行重采样。
upfirdn上采样、FIR 滤波和下采样。

Filter design

bilinear使用双线性变换从模拟滤波器返回数字 IIR 滤波器。
bilinear_zpk使用双线性变换从模拟滤波器返回数字 IIR 滤波器。
findfreqs(num, den, N[, kind])查找用于计算模拟滤波器响应的频率数组。
firls(numtaps, bands, desired, *[, weight, ...])使用最小二乘误差最小化设计 FIR 滤波器。
firwin(numtaps, cutoff, *[, width, window, ...])使用窗口方法设计 FIR 滤波器。
firwin2(numtaps, freq, gain, *[, nfreqs, ...])使用窗口方法设计 FIR 滤波器。
freqs(b, a[, worN, plot])计算模拟滤波器的频率响应。
freqs_zpk(z, p, k[, worN])计算模拟滤波器的频率响应。
freqz(b[, a, worN, whole, plot, fs, ...])计算数字滤波器的频率响应。
freqz_zpk(z, p, k[, worN, whole, fs])计算 ZPK 形式数字滤波器的频率响应。
sosfreqz(sos[, worN, whole, fs])计算 SOS 格式数字滤波器的频率响应。
gammatone(freq, ftype[, order, numtaps, fs])Gammatone 滤波器设计。
group_delay(system[, w, whole, fs])计算数字滤波器的群延迟。
iirdesign(wp, ws, gpass, gstop[, analog, ...])完成 IIR 数字和模拟滤波器设计。
iirfilter(N, Wn[, rp, rs, btype, analog, ...])给定阶数和关键点,设计 IIR 数字和模拟滤波器。
kaiser_atten(numtaps, width)计算 Kaiser FIR 滤波器的衰减。
kaiser_beta(a)给定衰减a,计算 Kaiser 参数beta
kaiserord(ripple, width)确定 Kaiser 窗口方法的滤波器窗口参数。
minimum_phase(h[, method, n_fft])将线性相位 FIR 滤波器转换为最小相位。
savgol_coeffs(window_length, polyorder[, ...])计算 1-D Savitzky-Golay FIR 滤波器的系数。
remez(numtaps, bands, desired, *[, weight, ...])使用 Remez 交换算法计算最小最大化优化滤波器。
unique_roots(p[, tol, rtype])从根列表中确定唯一的根及其重数。
residue(b, a[, tol, rtype])计算 b(s) / a(s) 的部分分数展开。
residuez(b, a[, tol, rtype])计算 b(z) / a(z) 的部分分数展开。
invres(r, p, k[, tol, rtype])从部分分数展开中计算 b(s) 和 a(s)。
invresz(r, p, k[, tol, rtype])从部分分数展开中计算 b(z) 和 a(z)。
BadCoefficients关于条件不佳的滤波器系数的警告。

低级滤波器设计函数:

abcd_normalize([A, B, C, D])检查状态空间矩阵并确保其为二维。
band_stop_obj(wp, ind, passb, stopb, gpass, ...)频带阻止目标函数,用于最小化阶数。
besselap(N[, norm])返回 N 阶贝塞尔滤波器的模拟原型 (z, p, k)。
buttap(N)返回 N 阶巴特沃斯滤波器的模拟原型 (z, p, k)。
cheb1ap(N, rp)返回 N 阶切比雪夫类型 I 模拟低通滤波器的 (z, p, k)。
cheb2ap(N, rs)返回 N 阶切比雪夫类型 II 模拟低通滤波器的 (z, p, k)。
cmplx_sort(p)
ellipap(N, rp, rs)返回第 N 阶椭圆模拟低通滤波器的 (z,p,k)。
lp2bp(b, a[, wo, bw])将低通滤波器原型转换到带通滤波器。
lp2bp_zpk(z, p, k[, wo, bw])将低通滤波器原型转换到带通滤波器。
lp2bs(b, a[, wo, bw])将低通滤波器原型转换到带阻滤波器。
lp2bs_zpk(z, p, k[, wo, bw])将低通滤波器原型转换到带阻滤波器。
lp2hp(b, a[, wo])将低通滤波器原型转换到高通滤波器。
lp2hp_zpk(z, p, k[, wo])将低通滤波器原型转换到高通滤波器。
lp2lp(b, a[, wo])将低通滤波器原型转换到不同的频率。
lp2lp_zpk(z, p, k[, wo])将低通滤波器原型转换到不同的频率。
normalize(b, a)归一化连续时间传递函数的分子/分母。

Matlab 风格 IIR 滤波器设计

butter(N, Wn[, btype, analog, output, fs])Butterworth 数字和模拟滤波器设计。
buttord(wp, ws, gpass, gstop[, analog, fs])Butterworth 滤波器阶数选择。
cheby1(N, rp, Wn[, btype, analog, output, fs])Chebyshev I 数字和模拟滤波器设计。
cheb1ord(wp, ws, gpass, gstop[, analog, fs])Chebyshev I 滤波器阶数选择。
cheby2(N, rs, Wn[, btype, analog, output, fs])Chebyshev II 数字和模拟滤波器设计。
cheb2ord(wp, ws, gpass, gstop[, analog, fs])Chebyshev II 滤波器阶数选择。
ellip(N, rp, rs, Wn[, btype, analog, output, fs])椭圆(考尔)数字和模拟滤波器设计。
ellipord(wp, ws, gpass, gstop[, analog, fs])椭圆(考尔)滤波器阶数选择。
bessel(N, Wn[, btype, analog, output, norm, fs])Bessel/Thomson 数字和模拟滤波器设计。
iirnotch(w0, Q[, fs])设计二阶 IIR 陷波数字滤波器。
iirpeak(w0, Q[, fs])设计二阶 IIR 峰值(共振)数字滤波器。
iircomb(w0, Q[, ftype, fs, pass_zero])设计 IIR 凹凸或峰值数字梳状滤波器。

连续时间线性系统

lti(*system)连续时间线性时不变系统基类。
StateSpace(*system, **kwargs)状态空间形式的线性时不变系统。
TransferFunction(*system, **kwargs)传递函数形式的线性时不变系统类。
ZerosPolesGain(*system, **kwargs)零极点增益形式的线性时不变系统类。
lsim(system, U, T[, X0, interp])模拟连续时间线性系统的输出。
lsim2(system[, U, T, X0])使用 ODE 求解器 scipy.integrate.odeint 模拟连续时间线性系统的输出。
impulse(system[, X0, T, N])连续时间系统的冲激响应。
impulse2(system[, X0, T, N])单输入连续时间线性系统的冲激响应。
step(system[, X0, T, N])连续时间系统的阶跃响应。
step2(system[, X0, T, N])连续时间系统的阶跃响应。
freqresp(system[, w, n])计算连续时间系统的频率响应。
bode(system[, w, n])计算连续时间系统的波德幅度和相位数据。

离散时间线性系统

dlti(*system, **kwargs)离散时间线性时不变系统基类。
StateSpace(*system, **kwargs)状态空间形式的线性时不变系统。
TransferFunction(*system, **kwargs)传递函数形式的线性时不变系统类。
ZerosPolesGain(*system, **kwargs)零点、极点、增益形式的线性时不变系统类。
dlsim(system, u[, t, x0])模拟离散时间线性系统的输出。
dimpulse(system[, x0, t, n])离散时间系统的冲激响应。
dstep(system[, x0, t, n])离散时间系统的阶跃响应。
dfreqresp(system[, w, n, whole])计算离散时间系统的频率响应。
dbode(system[, w, n])计算离散时间系统的波德幅度和相位数据。

LTI 表示

tf2zpk(b, a)从分子、分母表示的线性滤波器返回零点、极点、增益(z, p, k)表示。
tf2sos(b, a[, pairing, analog])从传递函数表示返回二阶段节。
tf2ss(num, den)传递函数到状态空间表示。
zpk2tf(z, p, k)从零点和极点返回多项式传递函数表示。
zpk2sos(z, p, k[, pairing, analog])从系统的零点、极点和增益返回二阶段节。
zpk2ss(z, p, k)零极点增益表示转换为状态空间表示
ss2tf(A, B, C, D[, input])状态空间到传递函数的转换。
ss2zpk(A, B, C, D[, input])状态空间表示转换为零极点增益表示。
sos2zpk(sos)返回一系列二阶段的零点、极点和增益
sos2tf(sos)从一系列二阶段得到单一传递函数
cont2discrete(system, dt[, method, alpha])将连续状态空间系统转换为离散系统。
place_poles(A, B, poles[, method, rtol, maxiter])计算 K 使得特征值(A - dot(B, K))=poles。

波形

chirp(t, f0, t1, f1[, method, phi, vertex_zero])频率扫描余弦波生成器。
gausspulse(t[, fc, bw, bwr, tpr, retquad, ...])返回高斯调制正弦波:
max_len_seq(nbits[, state, length, taps])最大长度序列(MLS)生成器。
sawtooth(t[, width])返回周期锯齿波形或三角波形。
square(t[, duty])返回周期方波波形。
sweep_poly(t, poly[, phi])频率扫描余弦波生成器,具有时间相关的频率。
unit_impulse(shape[, idx, dtype])单位冲激信号(离散δ函数)或单位基向量。

窗口函数

对于窗口函数,请参见scipy.signal.windows命名空间。

scipy.signal命名空间中,有一个方便的函数可通过名称获取这些窗口:

get_window(window, Nx[, fftbins])返回指定长度和类型的窗口。

小波

cascade(hk[, J])从滤波器系数返回 dyadic 点K/2**J处的(x, phi, psi)。
daub(p)产生 Daubechies 小波的 FIR 低通滤波器系数。
morlet(M[, w, s, complete])复杂 Morlet 小波。
qmf(hk)从低通滤波器返回高通 qmf 滤波器。
ricker(points, a)返回一个 Ricker 小波,也称为“墨西哥帽小波”。
morlet2(M, s[, w])复杂 Morlet 小波,专为与cwt一起使用而设计。
cwt(data, wavelet, widths[, dtype])连续小波变换。

峰值检测

argrelmin(data[, axis, order, mode])计算data的相对最小值。
argrelmax(data[, axis, order, mode])计算data的相对最大值。
argrelextrema(data, comparator[, axis, ...])计算data的相对极值。
find_peaks(x[, height, threshold, distance, ...])基于峰值特性在信号内部找到峰值。
find_peaks_cwt(vector, widths[, wavelet, ...])使用小波变换在 1-D 数组中找到峰值。
peak_prominences(x, peaks[, wlen])计算信号中每个峰值的显著性。
peak_widths(x, peaks[, rel_height, ...])计算信号中每个峰值的宽度。

谱分析

periodogram(x[, fs, window, nfft, detrend, ...])使用周期图估算功率谱密度。
welch(x[, fs, window, nperseg, noverlap, ...])使用 Welch 方法估算功率谱密度。
csd(x, y[, fs, window, nperseg, noverlap, ...])使用 Welch 方法估计交叉功率谱密度 Pxy。
coherence(x, y[, fs, window, nperseg, ...])使用 Welch 方法估计离散时间信号 X 和 Y 的幅度平方相干估计 Cxy。
spectrogram(x[, fs, window, nperseg, ...])使用连续傅里叶变换计算谱图。
lombscargle(x, y, freqs)计算朗伯-斯卡戈尔周期图。
vectorstrength(events, period)确定与给定周期对应的事件的向量强度。
ShortTimeFFT(win, hop, fs, *[, fft_mode, ...])提供参数化的离散短时傅里叶变换(STFT)及其逆变换(ISTFT)。
stft(x[, fs, window, nperseg, noverlap, ...])计算短时傅里叶变换(STFT)。
istft(Zxx[, fs, window, nperseg, noverlap, ...])执行逆短时傅里叶变换(iSTFT)。
check_COLA(window, nperseg, noverlap[, tol])检查是否满足恒定重叠添加(COLA)约束。
check_NOLA(window, nperseg, noverlap[, tol])检查非零重叠添加(NOLA)约束是否满足。

Chirp Z-transform and Zoom FFT

czt(x[, m, w, a, axis])计算 Z 平面上螺旋周围的频率响应。
zoom_fft(x, fn[, m, fs, endpoint, axis])仅计算范围内频率 fnx 的离散傅里叶变换(DFT)。
CZT(n[, m, w, a])创建可调用的啁啾 Z 变换函数。
ZoomFFT(n, fn[, m, fs, endpoint])创建可调用的缩放 FFT 变换函数。
czt_points(m[, w, a])返回进行啁啾 Z 变换的点。

函数比类更易于使用,但在对许多长度相同的数组执行相同变换时效率较低,因为它们在每次调用时都会重复生成相同的啁啾信号。在这些情况下,使用类来创建可重复使用的函数更为合适。

scipy.signal.convolve

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.convolve.html#scipy.signal.convolve

scipy.signal.convolve(in1, in2, mode='full', method='auto')

对两个 N 维数组进行卷积。

使用mode参数确定输出大小,对in1in2进行卷积。

参数:

in1array_like

第一个输入。

in2array_like

第二输入。应与in1具有相同数量的维度。

modestr {‘full’, ‘valid’, ‘same’},可选

一个表示输出大小的字符串:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅包含那些不依赖于零填充的元素。在‘valid’模式下,in1in2必须至少在每个维度上与另一个一样大。

same

输出与in1相同大小,并相对于‘full’输出中心化。

methodstr {‘auto’, ‘direct’, ‘fft’},可选

一个表示计算卷积使用的方法的字符串。

direct

卷积直接来自求和,即卷积的定义。

fft

通过调用fftconvolve使用傅立叶变换执行卷积。

auto

根据估计选择直接方法或傅立叶方法(默认)以提高速度。更多详细信息请参见注释。

新版本 0.19.0 中引入。

返回:

convolvearray

包含in1in2的离散线性卷积子集的 N 维数组。

警告:

RuntimeWarning

在包含 NAN 或 INF 的输入上使用 FFT 卷积将导致整个输出为 NAN 或 INF。当输入包含 NAN 或 INF 值时,请使用 method=’direct’。

另请参见

numpy.polymul

执行多项式乘法(相同操作,但还接受 poly1d 对象)

choose_conv_method

选择最快适当的卷积方法

fftconvolve

始终使用 FFT 方法。

oaconvolve

使用重叠-添加方法进行卷积,当输入数组大且大小显著不同时通常更快。

注释

默认情况下,convolvecorrelate 使用 method='auto',这会调用 choose_conv_method 来选择最快的方法,使用预先计算的值(choose_conv_method 还可以通过关键字参数测量真实世界的时间)。因为 fftconvolve 依赖于浮点数,所以存在某些约束可能会强制使用 method=direct(详细信息请参见 choose_conv_method 文档字符串)。

示例

使用汉宁窗口平滑方波脉冲:

>>> import numpy as np
>>> from scipy import signal
>>> sig = np.repeat([0., 1., 0.], 100)
>>> win = signal.windows.hann(50)
>>> filtered = signal.convolve(sig, win, mode='same') / sum(win) 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_win, ax_filt) = plt.subplots(3, 1, sharex=True)
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('Original pulse')
>>> ax_orig.margins(0, 0.1)
>>> ax_win.plot(win)
>>> ax_win.set_title('Filter impulse response')
>>> ax_win.margins(0, 0.1)
>>> ax_filt.plot(filtered)
>>> ax_filt.set_title('Filtered signal')
>>> ax_filt.margins(0, 0.1)
>>> fig.tight_layout()
>>> fig.show() 

../../_images/scipy-signal-convolve-1.png

scipy.signal.correlate

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

scipy.signal.correlate(in1, in2, mode='full', method='auto')

交叉相关两个 N 维数组。

in1in2 进行交叉相关,输出大小由 mode 参数确定。

参数:

in1array_like

第一个输入。

in2array_like

第二个输入。应与 in1 具有相同数量的维度。

modestr {‘full’, ‘valid’, ‘same’}, 可选

一个指示输出大小的字符串:

full

输出是输入的完整离散线性交叉相关。(默认)

valid

输出仅包含不依赖于零填充的元素。在“有效”模式下,in1in2 在每个维度上至少与另一个一样大。

same

输出与 in1 相同大小,相对于“full”输出居中。

methodstr {‘auto’, ‘direct’, ‘fft’}, 可选

表示计算相关性的方法的字符串。

direct

相关性直接根据总和确定。

fft

使用快速傅里叶变换来更快地执行相关性计算(仅适用于数值数组)。

auto

基于估计的速度更快的直接或傅里叶方法(默认)自动选择。详细信息请参阅 convolve 说明。

从版本 0.19.0 开始新添加。

返回:

correlatearray

包含 in1in2 的离散线性交叉相关的子集的 N 维数组。

另请参阅

choose_conv_method

包含更多关于 method 的文档。

correlation_lags

计算 1D 交叉相关的滞后/位移索引数组。

注意

两个 d 维数组 x 和 y 的相关性 z 定义为:

z[...,k,...] = sum[..., i_l, ...] x[..., i_l,...] * conj(y[..., i_l - k,...]) 

因此,如果 x 和 y 是 1-D 数组,并且 z = correlate(x, y, 'full'),则

[z[k] = (x * y)(k - N + 1) = \sum_{l=0}^{||x||-1}x_l y_{l-k+N-1}^{*}]

对于 (k = 0, 1, ..., ||x|| + ||y|| - 2)

其中 (||x||) 是 x 的长度,(N = \max(||x||,||y||)),当 m 超出 y 的范围时,(y_m) 为 0。

method='fft' 仅适用于数值数组,因为它依赖于 fftconvolve。在某些情况下(例如,对象数组或者当四舍五入整数可能会丢失精度时),始终使用 method='direct'

在使用偶数长度输入的“same”模式时,correlatecorrelate2d 的输出不同:它们之间有一个 1 索引偏移。

示例

使用互相关实现匹配滤波器,以恢复通过噪声通道传输的信号。

>>> import numpy as np
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng() 
>>> sig = np.repeat([0., 1., 1., 0., 1., 0., 0., 1.], 128)
>>> sig_noise = sig + rng.standard_normal(len(sig))
>>> corr = signal.correlate(sig_noise, np.ones(128), mode='same') / 128 
>>> clock = np.arange(64, len(sig), 128)
>>> fig, (ax_orig, ax_noise, ax_corr) = plt.subplots(3, 1, sharex=True)
>>> ax_orig.plot(sig)
>>> ax_orig.plot(clock, sig[clock], 'ro')
>>> ax_orig.set_title('Original signal')
>>> ax_noise.plot(sig_noise)
>>> ax_noise.set_title('Signal with noise')
>>> ax_corr.plot(corr)
>>> ax_corr.plot(clock, corr[clock], 'ro')
>>> ax_corr.axhline(0.5, ls=':')
>>> ax_corr.set_title('Cross-correlated with rectangular pulse')
>>> ax_orig.margins(0, 0.1)
>>> fig.tight_layout()
>>> plt.show() 

../../_images/scipy-signal-correlate-1_00_00.png

计算带噪声信号与原始信号的互相关。

>>> x = np.arange(128) / 128
>>> sig = np.sin(2 * np.pi * x)
>>> sig_noise = sig + rng.standard_normal(len(sig))
>>> corr = signal.correlate(sig_noise, sig)
>>> lags = signal.correlation_lags(len(sig), len(sig_noise))
>>> corr /= np.max(corr) 
>>> fig, (ax_orig, ax_noise, ax_corr) = plt.subplots(3, 1, figsize=(4.8, 4.8))
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('Original signal')
>>> ax_orig.set_xlabel('Sample Number')
>>> ax_noise.plot(sig_noise)
>>> ax_noise.set_title('Signal with noise')
>>> ax_noise.set_xlabel('Sample Number')
>>> ax_corr.plot(lags, corr)
>>> ax_corr.set_title('Cross-correlated signal')
>>> ax_corr.set_xlabel('Lag')
>>> ax_orig.margins(0, 0.1)
>>> ax_noise.margins(0, 0.1)
>>> ax_corr.margins(0, 0.1)
>>> fig.tight_layout()
>>> plt.show() 

../../_images/scipy-signal-correlate-1_01_00.png

scipy.signal.fftconvolve

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

scipy.signal.fftconvolve(in1, in2, mode='full', axes=None)

使用 FFT 对两个 N 维数组进行卷积。

使用快速 Fourier 变换方法对 in1in2 进行卷积,输出大小由 mode 参数确定。

对于大数组(n > ~500),这通常比 convolve 快得多,但是当仅需要少数输出值时可能较慢,并且只能输出浮点数数组(整数或对象数组输入将转换为浮点数)。

自 v0.19 起,convolve 根据哪种方法更快的估计自动选择。

参数:

in1array_like

第一个输入。

in2array_like

第二个输入。应与 in1 具有相同数量的维度。

modestr {'full', 'valid', 'same'},可选

指示输出大小的字符串:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅包含不依赖于零填充的元素。在 'valid' 模式下,in1in2 在每个维度上必须至少与另一个一样大。

same

输出与 in1 大小相同,相对于 'full' 输出居中。

axesint 或 array_like 的整数或 None,可选

计算卷积的轴。默认为所有轴。

返回:

outarray

包含 in1in2 的离散线性卷积的子集的 N 维数组。

另请参阅

convolve

根据速度选择直接卷积或 FFT 卷积算法。

oaconvolve

当输入数组大且尺寸显著不同时,使用重叠-添加方法进行卷积通常更快。

示例

白噪声的自相关是一个脉冲。

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> sig = rng.standard_normal(1000)
>>> autocorr = signal.fftconvolve(sig, sig[::-1], mode='full') 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_mag) = plt.subplots(2, 1)
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('White noise')
>>> ax_mag.plot(np.arange(-len(sig)+1,len(sig)), autocorr)
>>> ax_mag.set_title('Autocorrelation')
>>> fig.tight_layout()
>>> fig.show() 

使用 FFT 卷积实现高斯模糊。请注意图像周围的黑暗边界,这是由于超出其边界的零填充所致。convolve2d 函数允许其他类型的图像边界,但速度较慢。

>>> from scipy import datasets
>>> face = datasets.face(gray=True)
>>> kernel = np.outer(signal.windows.gaussian(70, 8),
...                   signal.windows.gaussian(70, 8))
>>> blurred = signal.fftconvolve(face, kernel, mode='same') 
>>> fig, (ax_orig, ax_kernel, ax_blurred) = plt.subplots(3, 1,
...                                                      figsize=(6, 15))
>>> ax_orig.imshow(face, cmap='gray')
>>> ax_orig.set_title('Original')
>>> ax_orig.set_axis_off()
>>> ax_kernel.imshow(kernel, cmap='gray')
>>> ax_kernel.set_title('Gaussian kernel')
>>> ax_kernel.set_axis_off()
>>> ax_blurred.imshow(blurred, cmap='gray')
>>> ax_blurred.set_title('Blurred')
>>> ax_blurred.set_axis_off()
>>> fig.show() 

../../_images/scipy-signal-fftconvolve-1_00.png../../_images/scipy-signal-fftconvolve-1_01.png

scipy.signal.oaconvolve

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.oaconvolve.html#scipy.signal.oaconvolve

scipy.signal.oaconvolve(in1, in2, mode='full', axes=None)

使用重叠添加方法对两个 N 维数组进行卷积。

使用重叠添加方法对in1in2进行卷积,输出大小由mode参数确定。

对于大数组(n > ~500),这通常比convolve快得多,并且通常比fftconvolve快得多,当一个数组远大于另一个数组时,但当仅需要少量输出值或数组在形状上非常相似时,可能会更慢,并且只能输出浮点数组(int 或 object 数组输入将被转换为 float)。

参数:

in1array_like

第一个输入。

in2array_like

第二输入。应该与in1具有相同的维数。

modestr {‘full’, ‘valid’, ‘same’},可选

指示输出大小的字符串:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅由不依赖于零填充的元素组成。在“valid”模式下,in1in2必须在每个维度上至少与另一个一样大。

same

输出与in1大小相同,相对于“full”输出居中。

axesint 或 int 数组或 None,可选

要计算卷积的轴。默认在所有轴上。

返回:

outarray

包含in1in2离散线性卷积子集的 N 维数组。

另请参阅

convolve

根据哪个更快,使用直接卷积或 FFT 卷积算法。

fftconvolve

使用 FFT 实现的卷积。

注意事项

新版本 1.4.0 中引入。

参考文献

[1]

Wikipedia,“重叠添加方法”。en.wikipedia.org/wiki/Overlap-add_method

[2]

Richard G. Lyons. 《理解数字信号处理》,第三版,2011。第 13.10 章。ISBN 13: 978-0137-02741-5

示例

用 512 个样本的滤波器卷积一个 100,000 个样本的信号。

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> sig = rng.standard_normal(100000)
>>> filt = signal.firwin(512, 0.01)
>>> fsig = signal.oaconvolve(sig, filt) 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_mag) = plt.subplots(2, 1)
>>> ax_orig.plot(sig)
>>> ax_orig.set_title('White noise')
>>> ax_mag.plot(fsig)
>>> ax_mag.set_title('Filtered noise')
>>> fig.tight_layout()
>>> fig.show() 

../../_images/scipy-signal-oaconvolve-1.png

scipy.signal.convolve2d

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

scipy.signal.convolve2d(in1, in2, mode='full', boundary='fill', fillvalue=0)

对两个二维数组进行卷积。

用于计算输出大小的模式以及由 boundaryfillvalue 决定的边界条件对 in1in2 进行卷积。

参数:

in1 类似数组

First input.

in2 类似数组

第二个输入。应该与 in1 具有相同数量的维度。

mode 字符串 {‘full’, ‘valid’, ‘same’},可选

表示输出大小的字符串:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅包含不依赖于零填充的元素。在“valid”模式下,in1in2 在每个维度上至少必须与另一个一样大。

same

输出与 in1 相同大小,并相对于“full”输出居中。

boundary 字符串 {‘fill’, ‘wrap’, ‘symm’},可选

一个指示如何处理边界的标志:

fill

用 fillvalue 填充输入数组。(默认)

wrap

循环边界条件。

symm

对称边界条件。

fillvalue 标量,可选

用于填充输入数组的值。默认为 0。

返回:

out ndarray

包含 in1in2 离散线性卷积子集的二维数组。

示例

使用复杂的 Scharr 算子通过 2D 卷积计算图像的梯度。(水平操作符是实部,垂直是虚部。)使用对称边界条件避免在图像边界创建边缘。

>>> import numpy as np
>>> from scipy import signal
>>> from scipy import datasets
>>> ascent = datasets.ascent()
>>> scharr = np.array([[ -3-3j, 0-10j,  +3 -3j],
...                    [-10+0j, 0+ 0j, +10 +0j],
...                    [ -3+3j, 0+10j,  +3 +3j]]) # Gx + j*Gy
>>> grad = signal.convolve2d(ascent, scharr, boundary='symm', mode='same') 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_mag, ax_ang) = plt.subplots(3, 1, figsize=(6, 15))
>>> ax_orig.imshow(ascent, cmap='gray')
>>> ax_orig.set_title('Original')
>>> ax_orig.set_axis_off()
>>> ax_mag.imshow(np.absolute(grad), cmap='gray')
>>> ax_mag.set_title('Gradient magnitude')
>>> ax_mag.set_axis_off()
>>> ax_ang.imshow(np.angle(grad), cmap='hsv') # hsv is cyclic, like angles
>>> ax_ang.set_title('Gradient orientation')
>>> ax_ang.set_axis_off()
>>> fig.show() 

../../_images/scipy-signal-convolve2d-1.png

scipy.signal.correlate2d

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.correlate2d.html#scipy.signal.correlate2d

scipy.signal.correlate2d(in1, in2, mode='full', boundary='fill', fillvalue=0)

交叉相关两个二维数组。

mode确定输出大小,boundaryfillvalue确定边界条件交叉相关in1in2

参数:

in1array_like

第一个输入。

in2array_like

第二个输入。应与in1具有相同数量的维度。

modestr {‘full’, ‘valid’, ‘same’},可选

指示输出大小的字符串:

full

输出是输入的完整离散线性交叉相关。(默认)

valid

输出仅包含那些不依赖于零填充的元素。在“valid”模式下,in1in2必须至少在每个维度上与另一个一样大。

same

输出与in1相同大小,相对于“full”输出居中。

boundarystr {‘fill’, ‘wrap’, ‘symm’},可选

指示如何处理边界的标志:

fill

用 fillvalue 填充输入数组。(默认)

wrap

循环边界条件。

symm

对称边界条件。

fillvaluescalar,可选

用于填充填充输入数组的值。默认为 0。

返回:

correlate2dndarray

包含in1in2的离散线性交叉相关子集的二维数组。

注意事项

使用偶数长度输入的“same”模式时,correlatecorrelate2d的输出不同:它们之间存在 1 索引偏移。

示例

使用 2D 交叉相关在嘈杂图像中找到模板的位置:

>>> import numpy as np
>>> from scipy import signal
>>> from scipy import datasets
>>> rng = np.random.default_rng()
>>> face = datasets.face(gray=True) - datasets.face(gray=True).mean()
>>> template = np.copy(face[300:365, 670:750])  # right eye
>>> template -= template.mean()
>>> face = face + rng.standard_normal(face.shape) * 50  # add noise
>>> corr = signal.correlate2d(face, template, boundary='symm', mode='same')
>>> y, x = np.unravel_index(np.argmax(corr), corr.shape)  # find the match 
>>> import matplotlib.pyplot as plt
>>> fig, (ax_orig, ax_template, ax_corr) = plt.subplots(3, 1,
...                                                     figsize=(6, 15))
>>> ax_orig.imshow(face, cmap='gray')
>>> ax_orig.set_title('Original')
>>> ax_orig.set_axis_off()
>>> ax_template.imshow(template, cmap='gray')
>>> ax_template.set_title('Template')
>>> ax_template.set_axis_off()
>>> ax_corr.imshow(corr, cmap='gray')
>>> ax_corr.set_title('Cross-correlation')
>>> ax_corr.set_axis_off()
>>> ax_orig.plot(x, y, 'ro')
>>> fig.show() 

../../_images/scipy-signal-correlate2d-1.png

scipy.signal.sepfir2d

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.sepfir2d.html#scipy.signal.sepfir2d

scipy.signal.sepfir2d(input, hrow, hcol)

用二维可分离 FIR 滤波器进行卷积。

将二阶排列输入数组与由一阶数组 hrow 和 hcol 定义的可分离滤波器卷积。假设使用镜像对称边界条件。此函数可用于根据其 B-样条表示找到图像。

参数:

inputndarray

输入信号。必须是二阶数组。

hrowndarray

定义滤波器行方向的一阶数组。必须是奇数长度。

hcolndarray

定义滤波器列方向的一阶数组。必须是奇数长度。

返回:

outputndarray

过滤后的信号。

示例

示例显示在教程中。

scipy.signal.choose_conv_method

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.choose_conv_method.html#scipy.signal.choose_conv_method

scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)

找到最快的卷积/相关方法。

主要用于在卷积相关method='auto'选项期间调用。它还可用于确定许多相同 dtype/shape 的卷积的method的值。此外,它支持根据特定输入和/或硬件的时间来调整method的值。

参数:

in1类数组

传递给卷积函数的第一个参数。

in2类数组

传递给卷积函数的第二个参数。

模式字符串 {‘full’, ‘valid’, ‘same’},可选

输出大小的字符串指示:

full

输出是输入的完整离散线性卷积。(默认)

valid

输出仅包含不依赖于零填充的元素。

same

输出与in1相同大小,相对于‘full’输出居中。

测量布尔值,可选

如果为 True,则使用两种方法运行和计时in1in2的卷积,并返回最快的方法。如果为 False(默认),则使用预计算的值预测最快方法。

返回:

方法字符串

指示哪种卷积方法最快的字符串,可以是‘direct’或‘fft’

times字典,可选

包含每种方法所需时间(以秒为单位)的字典。仅当measure=True时才返回此值。

另见

卷积

相关

注意

一般来说,对于随机选择的输入尺寸,此方法在 2D 信号中的准确率为 99%,在 1D 信号中为 85%。为了精度,使用measure=True来找到计算卷积所需的最快方法。这可以用来避免稍后找到最快method的最小开销,或者根据特定输入集合调整method的值。

实验在 Amazon EC2 r5a.2xlarge 机器上运行,以测试此函数。这些实验测量了使用method='auto'时所需的时间与最快方法(即ratio = time_auto / min(time_fft, time_direct))之间的比率。在这些实验中,我们发现:

  • 对于 1D 信号,这个比率小于 1.5 的可能性为 95%,对于 2D 信号,这个比率小于 2.5 的可能性为 99%。

  • 对于 1D/2D 信号,这个比率始终小于 2.5/5。

  • 此函数在处理method='direct'的 1D 卷积时最不准确,耗时介于 1 到 10 毫秒之间。在我们的实验中,这个值的一个良好代理是1e6 <= in1.size * in2.size <= 1e7

2D 结果几乎可以肯定地推广到 3D/4D 等,因为实现是相同的(1D 实现是不同的)。

上述所有数字都特定于 EC2 机器。然而,我们确实发现该函数在不同硬件上表现相当良好。速度测试的质量与调整此函数数字的机器相似(一台 2014 年中期的 15 英寸 MacBook Pro,配备 16GB RAM 和 2.5GHz 的 Intel i7 处理器)。

存在一些情况,fftconvolve支持输入,但此函数返回direct(例如,为了防止浮点整数精度问题)。

从 0.19 版本开始新增。

示例

估算给定输入的最快方法:

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> img = rng.random((32, 32))
>>> filter = rng.random((8, 8))
>>> method = signal.choose_conv_method(img, filter, mode='same')
>>> method
'fft' 

然后可以应用于相同数据类型和形状的其他数组:

>>> img2 = rng.random((32, 32))
>>> filter2 = rng.random((8, 8))
>>> corr2 = signal.correlate(img2, filter2, mode='same', method=method)
>>> conv2 = signal.convolve(img2, filter2, mode='same', method=method) 

此函数的输出(method)与correlateconvolve一起使用。

scipy.signal.correlation_lags

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

scipy.signal.correlation_lags(in1_len, in2_len, mode='full')

计算一维交叉相关的滞后/位移索引数组。

参数:

in1_len整数

第一个输入大小。

in2_len整数

第二个输入大小。

模式str {‘full’, ‘valid’, ‘same’},可选

指示输出大小的字符串。有关更多信息,请参阅文档correlate

返回:

lags数组

返回一个包含交叉相关滞后/位移索引的数组。可以使用相关性的 np.argmax 来索引 lag/displacement。

另请参阅

correlate

计算 N 维交叉相关。

注意事项

连续函数(f)和(g)的交叉相关定义为:

[\left ( f\star g \right )\left ( \tau \right ) \triangleq \int_{t_0}^{t_0 +T} \overline{f\left ( t \right )}g\left ( t+\tau \right )dt]

其中(\tau)定义为位移,也称为滞后。

离散函数(f)和(g)的交叉相关定义为:

[\left ( f\star g \right )\left [ n \right ] \triangleq \sum_{-\infty}^{\infty} \overline{f\left [ m \right ]}g\left [ m+n \right ]]

其中(n)为滞后。

示例

信号与其自身延迟的交叉相关。

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> x = rng.standard_normal(1000)
>>> y = np.concatenate([rng.standard_normal(100), x])
>>> correlation = signal.correlate(x, y, mode="full")
>>> lags = signal.correlation_lags(x.size, y.size, mode="full")
>>> lag = lags[np.argmax(correlation)] 

scipy.signal.bspline

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.bspline.html#scipy.signal.bspline

scipy.signal.bspline(x, n)

自版本 1.11.0 起已弃用:scipy.signal.bspline 在 SciPy 1.11 中已弃用,并将在 SciPy 1.13 中移除。

对于浮点数组 x 的精确等价物是:

>>> import numpy as np
>>> from scipy.interpolate import BSpline
>>> knots = np.arange(-(n+1)/2, (n+3)/2)
>>> out = BSpline.basis_element(knots)(x)
>>> out[(x < knots[0]) | (x > knots[-1])] = 0.0 

阶数为 n 的 B 样条基函数。

参数:

xarray_like

一个结点向量

nint

样条的阶数。必须是非负的,即 n >= 0

返回:

resndarray

B 样条基函数值

另请参见

cubic

一个立方 B 样条。

quadratic

一个二次 B 样条。

注意事项

使用 numpy.piecewise 和自动函数生成器。

示例

我们可以计算几个阶数的 B 样条基函数:

>>> import numpy as np
>>> from scipy.signal import bspline, cubic, quadratic
>>> bspline(0.0, 1)
1 
>>> knots = [-1.0, 0.0, -1.0]
>>> bspline(knots, 2)
array([0.125, 0.75, 0.125]) 
>>> np.array_equal(bspline(knots, 2), quadratic(knots))
True 
>>> np.array_equal(bspline(knots, 3), cubic(knots))
True 

scipy.signal.cubic

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cubic.html#scipy.signal.cubic

scipy.signal.cubic(x)

自 SciPy 1.11.0 版本起不推荐使用:scipy.signal.cubic在 SciPy 1.11 中已弃用,并将在 SciPy 1.13 中移除。

具体的等价(对于浮点数组x)是:

>>> from scipy.interpolate import BSpline
>>> out = BSpline.basis_element([-2, -1, 0, 1, 2])(x)
>>> out[(x < -2 | (x > 2)] = 0.0 

三次 B 样条。

这是bspline的一个特例,相当于bspline(x, 3)

参数:

xarray_like

一个结点向量

返回:

resndarray

三次 B 样条基函数值

另请参阅

bspline

B 样条阶数为 n 的基函数

quadratic

二次 B 样条。

示例

我们可以计算几个阶数的 B 样条基函数:

>>> import numpy as np
>>> from scipy.signal import bspline, cubic, quadratic
>>> bspline(0.0, 1)
1 
>>> knots = [-1.0, 0.0, -1.0]
>>> bspline(knots, 2)
array([0.125, 0.75, 0.125]) 
>>> np.array_equal(bspline(knots, 2), quadratic(knots))
True 
>>> np.array_equal(bspline(knots, 3), cubic(knots))
True 

scipy.signal.quadratic

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

scipy.signal.quadratic(x)

自 1.11.0 版本起弃用:scipy.signal.quadratic

对于浮点数数组x的确切等效是:

>>> from scipy.interpolate import BSpline
>>> out = BSpline.basis_element([-1.5, -0.5, 0.5, 1.5])(x)
>>> out[(x < -1.5 | (x > 1.5)] = 0.0 

一个二次 B 样条。

这是bspline的特殊情况,等同于bspline(x, 2)

参数:

xarray_like

结点向量

返回:

resndarray

二次 B 样条基函数值

另请参阅

bspline

阶数为 n 的 B 样条基函数

cubic

一个三次 B 样条。

示例

我们可以计算多个阶次的 B 样条基函数:

>>> import numpy as np
>>> from scipy.signal import bspline, cubic, quadratic
>>> bspline(0.0, 1)
1 
>>> knots = [-1.0, 0.0, -1.0]
>>> bspline(knots, 2)
array([0.125, 0.75, 0.125]) 
>>> np.array_equal(bspline(knots, 2), quadratic(knots))
True 
>>> np.array_equal(bspline(knots, 3), cubic(knots))
True 

scipy.signal.gauss_spline

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

scipy.signal.gauss_spline(x, n)

n 阶 B 样条基函数的高斯近似。

参数:

x array_like

结节向量

n整型

样条的阶数。必须为非负数,即 n >= 0

返回值:

res ndarray

B 样条基函数值由均值为零的高斯函数近似。

注意事项:

B 样条基函数可以用均值为零、标准差等于(\sigma=(n+1)/12)的高斯函数很好地近似:

[\frac{1}{\sqrt {2\pi\sigma²}}exp(-\frac{x²}{2\sigma})]

参考文献:

[1]

Bouma H., Vilanova A., Bescos J.O., ter Haar Romeny B.M., Gerritsen F.A. (2007) 基于 B 样条的快速精确高斯导数。在:Sgallari F., Murli A., Paragios N. (eds) 计算机视觉中的尺度空间与变分方法。SSVM 2007. 计算机科学讲座笔记,4485. Springer, Berlin, Heidelberg

[2]

folk.uio.no/inf3330/scripting/doc/python/SciPy/tutorial/old/node24.html

示例

我们可以计算由高斯分布近似的 B 样条基函数:

>>> import numpy as np
>>> from scipy.signal import gauss_spline, bspline
>>> knots = np.array([-1.0, 0.0, -1.0])
>>> gauss_spline(knots, 3)
array([0.15418033, 0.6909883, 0.15418033])  # may vary 
>>> bspline(knots, 3)
array([0.16666667, 0.66666667, 0.16666667])  # may vary 

scipy.signal.cspline1d

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

scipy.signal.cspline1d(signal, lamb=0.0)

计算秩-1 数组的三次样条系数。

假设镜像对称边界条件,找到一维信号的三次样条系数。为了从样条表示中恢复信号,使用长度为 3 的 FIR 窗口 [1.0, 4.0, 1.0]/ 6.0 镜像对称卷积这些系数。

参数:

signal ndarray

一个表示信号样本的秩-1 数组。

lamb float, optional

平滑系数,默认为 0.0。

返回值:

c ndarray

三次样条系数。

参见

cspline1d_eval

在新点集上评估三次样条。

示例

我们可以使用三次样条来滤波信号,以减少并平滑高频噪声:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.signal import cspline1d, cspline1d_eval
>>> rng = np.random.default_rng()
>>> sig = np.repeat([0., 1., 0.], 100)
>>> sig += rng.standard_normal(len(sig))*0.05  # add noise
>>> time = np.linspace(0, len(sig))
>>> filtered = cspline1d_eval(cspline1d(sig), time)
>>> plt.plot(sig, label="signal")
>>> plt.plot(time, filtered, label="filtered")
>>> plt.legend()
>>> plt.show() 

../../_images/scipy-signal-cspline1d-1.png

scipy.signal.qspline1d

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.qspline1d.html#scipy.signal.qspline1d

scipy.signal.qspline1d(signal, lamb=0.0)

计算秩为 1 的数组的二次样条系数。

参数:

signalndarray

代表信号样本的秩为 1 的数组。

lambfloat, optional

平滑系数(现在必须为零)。

返回:

cndarray

二次样条系数。

另请参见

qspline1d_eval

在新的点集上评估二次样条。

注意事项

假设镜像对称边界条件,为 1-D 信号找到二次样条系数。为了从样条表示中恢复信号,使用长度为 3 的 FIR 窗口[1.0, 6.0, 1.0] / 8.0 镜像对称卷积这些系数。

示例

通过二次样条可以滤波信号,以减少和平滑高频噪声:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.signal import qspline1d, qspline1d_eval
>>> rng = np.random.default_rng()
>>> sig = np.repeat([0., 1., 0.], 100)
>>> sig += rng.standard_normal(len(sig))*0.05  # add noise
>>> time = np.linspace(0, len(sig))
>>> filtered = qspline1d_eval(qspline1d(sig), time)
>>> plt.plot(sig, label="signal")
>>> plt.plot(time, filtered, label="filtered")
>>> plt.legend()
>>> plt.show() 

../../_images/scipy-signal-qspline1d-1.png

scipy.signal.cspline2d

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cspline2d.html#scipy.signal.cspline2d

scipy.signal.cspline2d(input, lambda=0.0, precision=-1.0)

二维立方(3 阶)B 样条的系数。

返回二维输入图像的规则间隔输入网格上的三阶 B 样条系数。

参数:

输入ndarray

输入信号。

λfloat

指定传递函数中平滑的程度。

精度float

指定计算无限和以应用镜像对称边界条件所需的精度。

返回:

输出ndarray

过滤后的信号。

示例

示例可以在 tutorial 中找到。

scipy.signal.qspline2d

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.qspline2d.html#scipy.signal.qspline2d

scipy.signal.qspline2d(input, lambda=0.0, precision=-1.0)

2-D 二次(2 阶)B 样条的系数:

返回二维输入图像在规则间隔的输入网格上的二阶 B 样条系数。

参数:

inputndarray

输入信号。

lambdafloat

指定传递函数中的平滑量。

precisionfloat

指定计算应用镜像对称边界条件所需的无限和的精度。

返回:

outputndarray

过滤后的信号。

示例

示例参见教程。

scipy.signal.cspline1d_eval

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.cspline1d_eval.html#scipy.signal.cspline1d_eval

scipy.signal.cspline1d_eval(cj, newx, dx=1.0, x0=0)

在新一组点上评估三次样条曲线。

dx 是旧的采样间距,而 x0 是旧的原点。换句话说,cj 表示样条系数的旧样本点(结点)是等间距点:

oldx = x0 + j*dx j=0…N-1,其中 N=len(cj)

边界使用镜像对称边界条件处理。

参数:

cjndarray

三次样条曲线系数

newxndarray

新一组点。

dxfloat,可选

旧的采样间距,默认值为 1.0。

x0int,可选

旧的原点,默认值为 0。

返回:

resndarray

评估了三次样条曲线点。

另请参见

cspline1d

计算一维数组的三次样条系数。

示例

我们可以使用三次样条滤波器来过滤信号,以减少和平滑高频噪声:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.signal import cspline1d, cspline1d_eval
>>> rng = np.random.default_rng()
>>> sig = np.repeat([0., 1., 0.], 100)
>>> sig += rng.standard_normal(len(sig))*0.05  # add noise
>>> time = np.linspace(0, len(sig))
>>> filtered = cspline1d_eval(cspline1d(sig), time)
>>> plt.plot(sig, label="signal")
>>> plt.plot(time, filtered, label="filtered")
>>> plt.legend()
>>> plt.show() 

../../_images/scipy-signal-cspline1d_eval-1.png

scipy.signal.qspline1d_eval

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.qspline1d_eval.html#scipy.signal.qspline1d_eval

scipy.signal.qspline1d_eval(cj, newx, dx=1.0, x0=0)

在新的一组点上评估二次样条。

参数:

cjndarray

二次样条系数

newxndarray

新的一组点。

dxfloat,可选

旧的样本间距,默认值为 1.0。

x0int,可选

旧原点,默认值为 0。

返回:

resndarray

评估了二次样条点。

参见

qspline1d

为 rank-1 数组计算二次样条系数。

注意

dx是旧的样本间距,而x0是旧的原点。换句话说,旧样本点(结点点)为均匀间隔的点:

oldx = x0 + j*dx  j=0...N-1, with N=len(cj) 

边界使用镜像对称边界条件处理。

示例

我们可以使用二次样条对信号进行滤波,以减少和平滑高频噪声:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.signal import qspline1d, qspline1d_eval
>>> rng = np.random.default_rng()
>>> sig = np.repeat([0., 1., 0.], 100)
>>> sig += rng.standard_normal(len(sig))*0.05  # add noise
>>> time = np.linspace(0, len(sig))
>>> filtered = qspline1d_eval(qspline1d(sig), time)
>>> plt.plot(sig, label="signal")
>>> plt.plot(time, filtered, label="filtered")
>>> plt.legend()
>>> plt.show() 

../../_images/scipy-signal-qspline1d_eval-1.png

scipy.signal.spline_filter

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.spline_filter.html#scipy.signal.spline_filter

scipy.signal.spline_filter(Iin, lmbda=5.0)

对一个排名为 2 的数组进行三次样条(立方)平滑滤波。

使用(立方)平滑样条滤波器对输入数据集Iin进行滤波。

参数:

Iinarray_like

输入数据集

lmbdafloat,可选

样条平滑的衰减值,默认为5.0

返回:

resndarray

过滤后的输入数据

示例

我们可以使用三次 B 样条滤波器来过滤多维信号(例如:2D 图像):

>>> import numpy as np
>>> from scipy.signal import spline_filter
>>> import matplotlib.pyplot as plt
>>> orig_img = np.eye(20)  # create an image
>>> orig_img[10, :] = 1.0
>>> sp_filter = spline_filter(orig_img, lmbda=0.1)
>>> f, ax = plt.subplots(1, 2, sharex=True)
>>> for ind, data in enumerate([[orig_img, "original image"],
...                             [sp_filter, "spline filter"]]):
...     ax[ind].imshow(data[0], cmap='gray_r')
...     ax[ind].set_title(data[1])
>>> plt.tight_layout()
>>> plt.show() 

../../_images/scipy-signal-spline_filter-1.png

scipy.signal.order_filter

原文:docs.scipy.org/doc/scipy-1.12.0/reference/generated/scipy.signal.order_filter.html#scipy.signal.order_filter

scipy.signal.order_filter(a, domain, rank)

在一个 N 维数组上执行顺序滤波。

在输入数组上执行顺序滤波。domain 参数充当以每个像素为中心的蒙版。domain 的非零元素用于选择围绕每个输入像素的元素,并放置在一个列表中。列表被排序,该像素的输出是在排序列表中对应于 rank 的元素。

参数:

andarray

N 维输入数组。

domainarray_like

a具有相同维数的蒙版数组。每个维度应该有奇数个元素。

rankint

一个非负整数,用于从排序列表中选择元素(0 对应最小元素,1 是下一个最小元素,依此类推)。

返回:

outndarray

a相同形状的数组中的有序滤波结果。

示例

>>> import numpy as np
>>> from scipy import signal
>>> x = np.arange(25).reshape(5, 5)
>>> domain = np.identity(3)
>>> x
array([[ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9],
 [10, 11, 12, 13, 14],
 [15, 16, 17, 18, 19],
 [20, 21, 22, 23, 24]])
>>> signal.order_filter(x, domain, 0)
array([[  0.,   0.,   0.,   0.,   0.],
 [  0.,   0.,   1.,   2.,   0.],
 [  0.,   5.,   6.,   7.,   0.],
 [  0.,  10.,  11.,  12.,   0.],
 [  0.,   0.,   0.,   0.,   0.]])
>>> signal.order_filter(x, domain, 2)
array([[  6.,   7.,   8.,   9.,   4.],
 [ 11.,  12.,  13.,  14.,   9.],
 [ 16.,  17.,  18.,  19.,  14.],
 [ 21.,  22.,  23.,  24.,  19.],
 [ 20.,  21.,  22.,  23.,  24.]]) 

scipy.signal.medfilt

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

scipy.signal.medfilt(volume, kernel_size=None)

对 N 维数组执行中值滤波。

使用由kernel_size 给定的局部窗口大小对输入数组应用中值滤波。数组将自动填充零。

参数:

volume 数组形式

一个 N 维输入数组。

kernel_size 数组形式,可选

标量或长度为 N 的列表,指定每个维度中中值滤波窗口的大小。kernel_size 的元素应为奇数。如果kernel_size 是标量,则在每个维度上使用此标量作为大小。每个维度的默认大小为 3。

返回:

out ndarray

一个与输入大小相同的数组,包含中值滤波后的结果。

警告:

用户警告

如果数组大小在任何维度上小于内核大小

另请参阅

scipy.ndimage.median_filter

scipy.signal.medfilt2d

注意事项

更通用的函数scipy.ndimage.median_filter 具有更有效的中值滤波实现,因此运行速度更快。

对于具有uint8float32float64数据类型的二维图像,专用函数scipy.signal.medfilt2d 可能更快。