2016-08-11 31 views
1

我有一個複數NumPy數組,我想將它轉換爲一個連續的NumPy數組,其中實部和虛部分開。將複數NumPy數組轉換爲(n,2) - 實數和虛數部分的陣列

import numpy 

u = numpy.array([ 
    1.0 + 2.0j, 
    2.0 + 4.0j, 
    3.0 + 6.0j, 
    4.0 + 8.0j 
    ]) 

u2 = numpy.ascontiguousarray(numpy.vstack((u.real, u.imag)).T) 

是卓有成效的,但調換,vstacking,轉換爲連續的陣列可能是一個或兩個步驟太多。

是否有一個本地NumPy函數爲我做到這一點?

回答

2

替代都不是native或節省重塑,轉置等

例如內部column_stack其輸入轉換爲2D「列」的陣列。有效地是做

In [1171]: np.concatenate((np.array(u.real,ndmin=2).T,np.array(u.imag,ndmin=2).T),axis=1) 
Out[1171]: 
array([[ 1., 2.], 
     [ 2., 4.], 
     [ 3., 6.], 
     [ 4., 8.]]) 

vstack通過其輸入端通過atleast_2d(m),確保各自是1行二維數組。 np.dstack使用atleast_3d(m)

一種新函數是np.stack

In [1174]: np.stack((u.real,u.imag),-1) 
Out[1174]: 
array([[ 1., 2.], 
     [ 2., 4.], 
     [ 3., 6.], 
     [ 4., 8.]]) 

它使用None索引以校正級聯尺寸;有效地:

np.concatenate((u.real[:,None],u.imag[:,None]),axis=1) 

所有最終使用np.concatenate;它和np.array是唯一編譯的連接函數。

另一個技巧是使用view

In [1179]: u.view('(2,)float') 
Out[1179]: 
array([[ 1., 2.], 
     [ 2., 4.], 
     [ 3., 6.], 
     [ 4., 8.]]) 

的復值被保存爲2間相鄰的浮動。因此,同一個databuffer可以被視爲純浮游物,或者將這個視圖看作浮游物的二維數組。與concatenate函數不同,這裏沒有複製。

替代方案的另一個測試是詢問當u是2d或更高時會發生什麼?

1

可以使用dstack

np.dstack((u.real, u.imag))[0] 
#Out[210]: 
#array([[ 1., 2.], 
#  [ 2., 4.], 
#  [ 3., 6.], 
#  [ 4., 8.]]) 
3

可以使用column_stack和堆棧兩個1-d陣列作爲列以使一個單一的2D陣列。

In [9]: np.column_stack((u.real,u.imag)) 
Out[9]: 
array([[ 1., 2.], 
     [ 2., 4.], 
     [ 3., 6.], 
     [ 4., 8.]]) 
+1

我只是檢查了一下:)它避免了醜陋的索引! –

相關問題