2017-11-15 18 views
0

配列のインデックスを持つ関数呼び出しを最適化この結果はループがなく、ラムダ関数をベクトル化しないので、私の理解ではベクトル化もループを使用しているからです。私はこれを達成するためにnumpy家族からの関数を探しています。私は、次のプロトタイプを持つ関数を持っている

私は運なしで次のことを試してみました:

b= np.array([0,1,2,3]); 
print(fun(inp,b)); 

を上記の問題は、それは私が必要とするだけで、現在のインデックスを渡して全体の配列を渡しています。

+0

? – clemens

+1

私はあなたの問題が何であるか理解できません。あなたは 'for'ループの出力を望むことをお勧めします。あなたの質問タイトルは、この計算をベクトル化することを示唆していますが、あなたはベクトル化を避けたいと言います。スピードを目指していますか?リスト全体を関数に渡して関数内で反復するのは、ループ内のすべてのインデックスを呼び出す関数呼び出しオーバーヘッドよりも高速です。あなたは自己完結型の例を含めることができますか?例えば ​​'inp'と' out'は定義されていません。 – roganjosh

+1

スカラー 'i'ではなく、' np.arange(4) 'を使うように関数を変更できますか? DFTについて何か知っている限り、改善を提案することはできません。あなたのコメントは – hpaulj

答えて

1

少し変更してfunはアレイで動作しますconst; sumaxisパラメータを追加します。

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

関連する問題