scipy.signal.fftconvolve仅沿着一个轴:如何才能做到呢?

k5ifujac  于 2023-04-06  发布在  其他
关注(0)|答案(3)|浏览(124)

我想使用scipy.signal.fftconvolve'full'类型)通过1D内核过滤信号。
但是,唉,有时我有多维数组,也应该由1D过滤器过滤(沿着一些指定的轴)。
我现在正在使用这个代码:

if len(original_shape) == 0:
    raise ValueError("in_signal should be an array, not scalar")
elif len(original_shape) == 1:
    out_signal = sp.signal.fftconvolve(in_signal, self._coeffs, 'full')[out_signal.size]
else:
    for index in np.ndindex(original_shape[1:]):
        slice_index = (slice(None),) + index
        out_signal[slice_index] = sp.signal.fftconvolve(
            in_signal[slice_index], self._coeffs, 'full')[:original_shape[0]]

return out_signal

我可以用一些东西来代替fftconvolve吗?

i1icjdpr

i1icjdpr1#

你可以用numpy.apply_along_axis来实现:

out_signal = numpy.apply_along_axis(convolve1d, axis, in_signal)

其中函数convolve1d是:

def convolve1d(array1d):
    return sp.signal.fftconvolve(array1d, self._coeffs, 'full')

或者(感谢Matthias下面的评论),你可以用apply_沿着_axis的 *args和**kwargs输入在一行中完成:

out_signal = numpy.apply_along_axis(convolve1d, axis, in_signal,
                                    self._coeffs, 'full')
b0zn9rqh

b0zn9rqh2#

根据您需要从2D数组或矩阵中获得的结果类型,您可以执行一些操作,例如对列求和并对结果行向量进行1D FFT,或者对行求和并对结果列向量进行1D FFT。

igsr9ssn

igsr9ssn3#

假设in_signal是2维的,并且您希望在最后一个维度应用卷积,则可以执行以下操作:

temp_coeffs = np.repeat(self._coeffs[np.newaxis,:],len(in_signal),0)
out_signal = sp.signal.fftconvolve(in_signal,temp_coeffs,mode='same',axes=-1)

相关问题