python 增加numpy 1d“信号阵列“的宽度

cuxqih21  于 2023-02-18  发布在  Python
关注(0)|答案(2)|浏览(118)

我有一个numpy整型一维数组,看起来像这样:

[0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0]

基本上,它是一个大部分为零的数组,其中一些信号为int [1,2,3,4,5,...],信号的“宽度”始终为1,这意味着它们被0包围。
我想给每个信号加上“width”,这样就不是只在数组中使用1个空格,而是在数组中使用宽度空格,在这个例子中,宽度为3,我会得到

[0,0,0,0,1,1,1,0,0,2,2,2,0,0,5,5,5,0,1,1,1,0,0,0,0,0,0,0,0,0]

数组的长度保持不变,宽度可以是3、5、7,但不能太离谱。
最快的方法是什么?我觉得可能有一个简单的方法可以做到这一点,但不确定如何正确调用这个操作。

moiiocjp

moiiocjp1#

卷积可能就是你要找的?

>>> import numpy as np
>>> width = 3
>>> a = np.array([0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0])
>>> np.convolve(a, np.ones(width))
array([0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 2., 2., 2., 0., 0., 5., 5.,
       5., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

但是这并不保留数组的长度,如果你想保留长度,你应该使用'same'模式:

>>> np.convolve(a, np.ones(width), mode='same')
array([0., 0., 0., 0., 1., 1., 1., 0., 0., 2., 2., 2., 0., 0., 5., 5., 5.,
       0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

如果这还不够快,我建议您看看scipy.signal.fftconvolve

jq6vz3qz

jq6vz3qz2#

我知道这不是完美的解决方案,但它是:我复制了初始列表并创建了一个宽度范围,这样当我发现一个不同于0的数字时,我会用适当的数字替换周围的零

arr = [0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0]
arr1 = [0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0]
width = 3
width_range = [i for i in range(width//(-2)+1,width//(2)+1)]
print('width_range: ',width_range)
for idx,elem in enumerate(arr):
    if elem !=0:
        for i in width_range:
            arr1[idx+i]=elem
print(arr1)

输出:

width_range:  [-1, 0, 1]
[0, 0, 0, 0, 1, 1, 1, 0, 0, 2, 2, 2, 0, 0, 5, 5, 5, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

PS:这个例子只适用于3和5,如果你想用7测试它,你需要在你的信号之间加零。

相关问题