少し変更してfun
はアレイで動作しますconst
; sum
にaxis
パラメータを追加します。
def fun(signal,const):
n = len(signal);
index = np.arange(n);
F = np.sum(signal*np.exp((-2*np.pi*np.complex(1j)*const*index)/n),axis=-1);
return F;
In [126]: signal = np.arange(10)*.1
In [139]: for i in range(4):
...: print(fun(signal,i))
(4.5+0j)
(-0.5+1.53884176859j)
(-0.5+0.688190960236j)
(-0.5+0.363271264003j)
Iが列ベクトルを提供することにより、同一の番号を生成:
In [142]: fun(signal, np.arange(4)[:,None])
Out[142]:
array([ 4.5+0.j , -0.5+1.53884177j, -0.5+0.68819096j,
-0.5+0.36327126j])
(4、n)のアレイ製造するindex
有するこのconst
乗算:
は
In [143]: np.arange(4)[:,None]*np.arange(10)
Out[143]:
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
[ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27]])
これは、他のスカラと(n、)signal
を(4、n)と掛け合わせます。最後の次元で合計すると、結果は(4、)配列になります。
私は、最近この考え方を説明した:
どのように ``印刷([BにおけるxのDFT(INP、X)])について
How do I shift my thinking to 'vectorize my computation' more than using 'for-loops'?
? – clemens
私はあなたの問題が何であるか理解できません。あなたは 'for'ループの出力を望むことをお勧めします。あなたの質問タイトルは、この計算をベクトル化することを示唆していますが、あなたはベクトル化を避けたいと言います。スピードを目指していますか?リスト全体を関数に渡して関数内で反復するのは、ループ内のすべてのインデックスを呼び出す関数呼び出しオーバーヘッドよりも高速です。あなたは自己完結型の例を含めることができますか?例えば 'inp'と' out'は定義されていません。 – roganjosh
スカラー 'i'ではなく、' np.arange(4) 'を使うように関数を変更できますか? DFTについて何か知っている限り、改善を提案することはできません。あなたのコメントは – hpaulj