2016-08-11 3 views
1

Ich habe ein komplexes NumPy-Array, das ich in ein zusammenhängendes NumPy-Array mit getrennten Real- und Imaginärteilen konvertieren möchte.Konvertiere komplexe NumPy-Arrays in (n, 2) -Arrays von Real- und Imaginärteilen

Diese

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) 

funktioniert der Trick, aber Transponieren, vstacking, und zu einem zusammenhängenden Array Umwandlung ist wahrscheinlich ein oder zwei Schritte zu viel.

Gibt es eine native NumPy-Funktion, die das für mich tut?

Antwort

2

Keine der Alternativen sind native oder reshape speichern, Transponierten usw.

Zum Beispiel intern column_stack konvertiert ihre Eingänge 2d ‚Spalte‘ Arrays. Effektiv ist es zu tun

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 gibt seine Eingänge durch atleast_2d(m), sicherstellen, dass jeweils ein 1 Zeile 2D-Array. np.dstack verwendet atleast_3d(m).

eine neue Funktion np.stack

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

Es verwendet None Indexierungs Abmessungen für Verkettung zu korrigieren; effektiv:

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

Alle np.concatenate am Ende mit; es und np.array sind die einzigen kompilierten Verbindungsfunktionen.

Ein weiterer Trick ist view

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

Die komplexen Werte gespeichert als 2 benachbarte Schwimmer sind zu verwenden. Derselbe Datenpuffer kann also als reiner Float oder mit dieser Ansicht als 2d-Array von Floats betrachtet werden. Im Gegensatz zu den concatenate Funktionen gibt es hier kein Kopieren.

Ein weiterer Test der Alternativen ist zu fragen, was passiert, wenn u 2d oder höher ist?

1

können Sie dstack verwenden:

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

können Sie column_stack verwenden und stapeln die beiden 1-D-Arrays als Spalten ein einziges 2D-Array zu machen.

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

Ich habe das gerade überprüft :) es vermeidet die hässliche Indizierung! –

Verwandte Themen