【问题标题】:Add width to a numpy 1d "signal array "将宽度添加到 numpy 1d“信号数组”
【发布时间】:2021-12-29 10:00:33
【问题描述】:

我有一个 numpy int 一维数组。看起来像这样:

[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]

基本上,它是一个主要由零组成的数组,其中一些信号是整数[1,2,3,4,5,...],并且信号的“宽度”始终为 1,这意味着它们被 0 包围。

我想为每个信号添加“宽度”,所以不是在数组中只占用 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,但不要太离谱。

最快的方法是什么?我觉得可能有一种简单的方法可以做到这一点,但不确定如何正确调用此操作。

【问题讨论】:

  • 我是古玩,我要问,你为什么要这样做?
  • 如果宽度大于可用空间怎么办?例如,如果 with 为 7,则数字将相交。
  • @white 在这种情况下,我们不会超过数组的长度,因此数组的总长度保持不变
  • @Mahrkeenerh,我正在构建一个模型,每个“信号”是 1/1000 毫秒,所以我想让它们更宽以便更好地预测。我正在使用 tensorflow,如果您知道他们为此将拥有的任何功能

标签: python arrays numpy


【解决方案1】:

卷积可能是您正在寻找的?

>>> 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

【讨论】:

    【解决方案2】:

    我知道这不是完美的解决方案,但它是: 我复制了初始列表并创建了一个宽度范围,所以当我发现一个不同于 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 进行测试,则需要在信号之间添加零。

    【讨论】:

    • 谢谢,我只是想知道是否有办法做到这一点,而无需遍历数组。我的实际数据是一个很长的数组,所以循环遍历它们会很慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2022-09-23
    • 2021-12-30
    • 2013-01-08
    相关资源
    最近更新 更多