2017-03-22 12 views
1

配列のベクトル化を使用して要素を反復してアクセスするMATLABコードを実装しようとしています。コードスニペットは、以下である:numpy配列の要素を反復してアクセスする最速の方法は?

"Z" は私に "iqiqiqiq ..." のような& Q交互すなわちI/Qストリーム値を含む配列である
z=z(1:2:end)+j*z(2:2:end); 

。私はnumpy配列を使用して実装しようとしていますが、成功しません。

注:numpy配列とpython-3.xを使用してMATLABアプローチをコピーするよりも速い上記のロジックを実装するための他の方法に関する提案も探しています。 (たとえば、あなたがより大きな配列から、それをスライスしてzを形成しなかった)

答えて

3

zの場合は、64ビット浮動小数点値のnumpyの配列で、z内のデータが連続している、あなたは、複雑なビューを作成することができますzなしコピーで:完全のために

In [56]: z 
Out[56]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

In [57]: z.view(np.complex128) 
Out[57]: array([ 0.+1.j, 2.+3.j, 4.+5.j, 6.+7.j, 8.+9.j]) 

、ここではMATLABコードのより直接的(かつ効率の低い)の翻訳です。

In [63]: z[::2] + z[1::2]*1j 
Out[63]: array([ 0.+1.j, 2.+3.j, 4.+5.j, 6.+7.j, 8.+9.j]) 

より冗長が、より効率的な方法のコピーを作成するには、次のとおりです:それはコピーを生成します。

In [73]: w = np.empty(len(z)//2, dtype=np.complex128) 

In [74]: w.real = z[::2] 

In [75]: w.imag = z[1::2] 

In [76]: w 
Out[76]: array([ 0.+1.j, 2.+3.j, 4.+5.j, 6.+7.j, 8.+9.j]) 

(私はwのサイズにlen(z)//2を使用。これは、zは次元1であると仮定しアレイ)

関連する問題