卷积类操作¶
日期 | 2008-02-06 (最后修改), 2008-02-06 (创建) |
---|
用户经常希望将数组分解成重叠的块,然后对每个块应用相同的操作。例如,您可以通过对每个块进行 FFT 来生成动态功率谱,或者您可以使用点积构造卷积。其中一些操作已经在 numpy 和 scipy 中存在,但其他一些则没有。解决此问题的一种方法是创建一个矩阵,其中每一列都是一个起始位置,每一行都是一个块。这通常需要复制一些数据,如果重叠很多,则可能需要复制大量数据,但 numpy 的步幅可以用来完成此操作。步幅的简化并非免费的;如果您修改了数组,所有共享元素都将被修改。尽管如此,它仍然是一个有用的操作。附件中包含代码,segmentaxis.py 。示例用法
In [ ]
In [1]: import numpy as N
In [2]: import segmentaxis
In [3]: a = N.zeros(30)
In [4]: a[15] = 1
In [5]: filter = N.array([0.1,0.5,1,0.5,0.1])
In [6]: sa = segmentaxis.segment_axis(a,len(filter),len(filter)-1)
In [7]: sa
Out[7]:
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
In [8]: N.dot(sa[::2,:],filter)
Out[8]:
array([ 0. , 0. , 0. , 0. , 0. , 0. , 0.5, 0.5, 0. , 0. , 0. ,
0. , 0. ])
In [9]: N.dot(sa[1::2,:],filter)
Out[9]:
array([ 0. , 0. , 0. , 0. , 0. , 0.1, 1. , 0.1, 0. , 0. , 0. ,
0. , 0. ])
In [10]: N.dot(sa,filter)
Out[10]:
array([ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0.1, 0.5, 1. , 0.5, 0.1, 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. ])
章节作者: AMArchibald
附件