我有一個 numpy int 1D 陣列。看起來像這樣:
[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,但沒有什么太離譜的。
什么是最快的方法來做到這一點?我覺得可能有一種簡單的方法可以做到這一點,但不確定如何正確呼叫此操作。
uj5u.com熱心網友回復:
卷積可能是你要找的?
>>> 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.
uj5u.com熱心網友回復:
我知道這不是完美的解決方案,但它是:我復制了初始串列并創建了一個寬度范圍,因此當我發現一個與 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 測驗它,你需要在你的信號之間添加零。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/361991.html
