2017-03-22 82 views
1

我想實現一個MATLAB代碼,它正在迭代並使用數組的矢量化訪問元素。代碼段是下面:迭代和訪問numpy數組元素的最快方法?

z=z(1:2:end)+j*z(2:2:end); 

其中 「z」 爲包含I/Q流值即交替我& q像陣列 「iqiqiqiq ...」。我試圖用numpy數組實現它,但沒有成功。

注意:也尋找任何其他方式來實現上述邏輯的建議,它比使用numpy數組和python-3.x複製MATLAB方法更快。

回答

3

如果z是64位的浮點值的numpy的陣列,並且在z的數據是連續的(例如,你沒有通過從更大的陣列切片它形成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]) 

(I用於len(z)//2用於w大小這假定z被一維陣列)。