首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Numpy/Scipy中的卷积计算

Numpy/Scipy中的卷积计算
EN

Stack Overflow用户
提问于 2011-07-28 15:00:54
回答 3查看 13.9K关注 0票数 16

分析我正在做的一些计算工作表明,我的程序中的一个瓶颈是一个基本上做到了这一点的函数(npnumpyspscipy):

代码语言:javascript
复制
def mix1(signal1, signal2):
    spec1 = np.fft.fft(signal1, axis=1)
    spec2 = np.fft.fft(signal2, axis=1)
    return np.fft.ifft(spec1*spec2, axis=1)

两个信号都具有形状(C, N),其中C是数据集的数量(通常小于20),N是每组中的样本数(约5000)。每个集合(行)的计算完全独立于任何其他集合。

我认为这只是一个简单的卷积,所以我尝试将其替换为:

代码语言:javascript
复制
def mix2(signal1, signal2):
    outputs = np.empty_like(signal1)

    for idx, row in enumerate(outputs):
        outputs[idx] = sp.signal.convolve(signal1[idx], signal2[idx], mode='same')

    return outputs

...just查看我是否得到了相同的结果。但我没有,我的问题是:

  1. 何乐而不为?
  2. 有没有更好的方法来计算等效值?

(我意识到mix2可能不会像现在这样更快,但它可能是并行化的一个很好的起点。)

下面是我用来快速检查的完整脚本:

代码语言:javascript
复制
import numpy as np
import scipy as sp
import scipy.signal

N = 4680
C = 6

def mix1(signal1, signal2):
    spec1 = np.fft.fft(signal1, axis=1)
    spec2 = np.fft.fft(signal2, axis=1)
    return np.fft.ifft(spec1*spec2, axis=1)

def mix2(signal1, signal2):
    outputs = np.empty_like(signal1)

    for idx, row in enumerate(outputs):
        outputs[idx] = sp.signal.convolve(signal1[idx], signal2[idx], mode='same')

    return outputs

def test(num, chans):
    sig1 = np.random.randn(chans, num)
    sig2 = np.random.randn(chans, num)
    res1 = mix1(sig1, sig2)
    res2 = mix2(sig1, sig2)

    np.testing.assert_almost_equal(res1, res2)

if __name__ == "__main__":
    np.random.seed(0x1234ABCD)
    test(N, C)
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6855169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档