迭代和访问numpy数组元素的最快方法是什么?

时间:2017-03-22 12:18:57

标签: python arrays python-3.x numpy iteration

我正在尝试实现一个MATLAB代码,该代码使用数组的向量化来迭代和访问元素。代码段如下:

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

其中“z”是包含I / Q流值的数组,即交替的i&我喜欢“iqiqiqiq ......”。我试图使用numpy数组实现它,但没有成功。

注意:还在寻找有关实现上述逻辑的任何其他方法的建议,这比使用numpy数组和python-3.x复制MATLAB方法更快。

1 个答案:

答案 0 :(得分: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])

(我使用len(z)//2作为w的大小。这假定z是一维数组。)