ローパス補間中に問題が発生しました。処理する前に 1D 配列をゼロで埋める必要があります。
私はこのようなものを持っています: [1 2 3 4 5 6]
この [1 0 2 0 3 0 4 0 5 0 6] のような配列が必要なため、配列内の L-1 ゼロです。ここで、L はゼロ スタッフィング前の配列内のすべての値の数です。
Pythonでそれを行う方法は?
ローパス補間中に問題が発生しました。処理する前に 1D 配列をゼロで埋める必要があります。
私はこのようなものを持っています: [1 2 3 4 5 6]
この [1 0 2 0 3 0 4 0 5 0 6] のような配列が必要なため、配列内の L-1 ゼロです。ここで、L はゼロ スタッフィング前の配列内のすべての値の数です。
Pythonでそれを行う方法は?
パディングされていない値のリストを別のゼロのリストのスライスに割り当てることができます。
original_list = range(1,7) # [1,2,3,4,5,6]
padded_list = [0]*(2*len(original_list)-1) # [0,0,0,0,0,0,0,0,0,0,0]
padded_list[::2] = original_list # [1,0,2,0,3,0,4,0,5,0,6]
これも翻訳できnumpy
ますが、ハイメがコメントで指摘したように、使用するのはさらに簡単ですnumpy.insert
:
import numpy as np
arr = np.arange(1, 7) # array([1, 2, 3, 4, 5, 6])
np.insert(arr, slice(1, None), 0) # array([1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6])
より大量のデータをリアルタイムで適用する必要があったため、パフォーマンスを確認したところ、Python 2.7 では np.insert が最も遅いようです。
np.insert: 1.393 ms
list: 0.406 ms
np.repeat then zero out: 0.409 ms
np.zeros then assign value: 0.073 ms
テストコードは次のとおりです。
import time
import numpy as np
start = 0
limit = 30000000
def tic():
global start
start = time.clock()
def toc(text):
print("%-30s %.3f ms" % (text, time.clock()-start))
original_list = range(1,limit)
original_array = np.arange(1, limit)
tic()
insert_array = np.insert(original_array, slice(1, None), 0)
toc("np.insert:")
tic()
padded_list = [0]*(2*len(original_list)-1)
padded_list[::2] = original_list
toc("list:")
tic()
repeat_array = np.repeat(original_array, 2)
repeat_array[1::2] = 0
toc("np.repeat then zero out:")
tic()
padded_array = np.zeros(2*len(original_list)-1, dtype=original_array.dtype)
padded_array[::2] = original_array
toc("np.zeros then assign value:")
単純なアプローチの 1 つ:
>>> i = [1,2,3,4,5,6]
>>> [i.insert(i.index(x)+1,0) for x in i[:-1]]
[None, None, None, None, None]
>>> i
[1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6]
上記と同じ、展開:
>>> for x in i[:-1]:
... i.insert(i.index(x)+1,0)
...
>>> i
[1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6]
def zero(array):
for i in range(1, len(array)):
array.insert(i+i-1,0)
return array
array = [1, 2, 3, 4, 5, 6]
newArray = zero(array)
必須のitertools
アプローチ:
>>> from itertools import izip, repeat, chain
>>> list(chain.from_iterable(izip(el, repeat(0))))[:-1]
[1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6]
はるかに良いitertools
アプローチ...
from itertools import islice, izip, repeat, chain
blah = list (islice (chain.from_iterable (izip(repeat (0), your_seq)), 1, None))