2017-07-10 3 views
0

ich wie so strukturiert haben eine Liste zu trennen:eine Liste von Listen von Punkten Konvertieren von y und x Listen

>>> print(pts) 
[[(120, 1200), (121, 1201), (122, 1202)], 
[(130, 1300), (131, 1301), (132, 1302)]] 

Und ich brauche alle x und y Punkte getrennt verkettet wie so:

>>> print(y) 
[120 121 122 130 131 132] 
>>> print(x) 
[1200 1201 1202 1300 1301 1302 

die ursprüngliche Liste wird durch das folgende Verfahren erzeugt:

pts = [] 
y = [120, 121, 122] 
x = [1200, 1201, 1202] 
pts.append(list(zip(y, x))) 
x = [1300, 1301, 1302] 
y = [130, 131, 132] 
pts.append(list(zip(y, x))) 

Das Endergebnis Listen seperate y und x sein muss, so kann man sie verwenden w ith np.polyfit(). Die Länge sowohl der einzelnen Punkteliste als auch der Gesamtliste variiert, aber ich werde immer die gleiche Länge von y- und x-Punkten haben. Ich denke, es sollte einen Weg geben, sich umzugestalten und in Stücke zu schneiden? Vielleicht könnte ich alle geraden Indizes für x und ungerade Indizes für y abflachen und nehmen?

+0

Die Duplikate sind nicht direkt anwendbar, da dieser Fall eine zusätzliche Verschachtelungsebene aufweist. – hpaulj

Antwort

4

Sie können dies versuchen:

from itertools import chain 

pts = [[(120, 1200), (121, 1201), (122, 1202)], 
[(130, 1300), (131, 1301), (132, 1302)]] 

all_points = list(chain(*pts)) 

y = [i[0] for i in all_points] 

x = [i[1] for i in all_points] 

print y 

print x 

Ausgang:

[120, 121, 122, 130, 131, 132] 

[1200, 1201, 1202, 1300, 1301, 1302] 

itertools.chain() können Sie die verschachtelte Liste glätten und in der Lage die Tupel zuzugreifen.

+0

Sie sind der Gewinner, danke! Obwohl ich die Liste reduzieren wollte, habe ich all_points = [Element für Unterliste in Punkten für Element in Unterliste] verwendet. Ein echtes Problem war, dass ich nicht wusste, wie ich die Indizes des Arrays in eine neue Liste ziehen sollte. Vielen Dank! – DrTarr

+0

@NateGreco Überlegen Sie, diese Antwort zu akzeptieren, wenn es Ihnen hilft, es hilft der Gemeinschaft. –

+0

Ich tat, es gibt eine 5-Minuten-Grenze. – DrTarr

3

Sie können auch zip mit Liste Verständnis verwenden:

x, y = zip(*(p for s in pts for p in s)) 

x 
# (120, 121, 122, 130, 131, 132) 

y 
# (1200, 1201, 1202, 1300, 1301, 1302) 
+1

Posted bevor ich merkte, dass wir das gleiche hatten. +1.Übrigens, vielleicht möchten Sie eine letzte Map (Liste, ...) anwenden, um eine Liste von Punkten zurückzugeben. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Danke für den Kommentar. Ich denke, 'np.polyfit' akzeptiert auch Tupel als Argument, also sollte es in diesem Fall nicht so viel ausmachen. Aber es wird etwas Nettes sein, um das zu erreichen, was OP vor Augen hat. – Psidom

+0

'polyfit' wendet' asarray' auf die 2 Eingänge an. – hpaulj

1

Normalerweise ist eine reine Liste Ansatz schneller ist, wenn sie mit kleinen Listen beginnen. Aber da Sie eine numpy Funktion füttern, die wahrscheinlich asarray auf seine Eingänge anwenden wird, würde ich einen Array-Transpose-Ansatz vorschlagen.

arr = np.array(pts) # 2x3x2 array 
arr = arr.reshape(6,2) 
x, y = arr.T # unpack a 2x6 array 

Testing:

In [614]: pts 
Out[614]: 
[[(120, 1200), (121, 1201), (122, 1202)], 
[(130, 1300), (131, 1301), (132, 1302)]] 
In [615]: np.array(pts).shape 
Out[615]: (2, 3, 2) 
In [616]: np.array(pts).reshape(-1,2).T 
Out[616]: 
array([[ 120, 121, 122, 130, 131, 132], 
     [1200, 1201, 1202, 1300, 1301, 1302]]) 
In [617]: y, x = np.array(pts).reshape(-1,2).T 
In [618]: y 
Out[618]: array([120, 121, 122, 130, 131, 132]) 
In [619]: x 
Out[619]: array([1200, 1201, 1202, 1300, 1301, 1302]) 

np.polyfit beginnt mit:

order = int(deg) + 1 
x = NX.asarray(x) + 0.0 
y = NX.asarray(y) + 0.0 

Wenn pts hatte mit extend die gemeinsame zip* hätte genügt,

In [625]: pts = [] 
    ...: y = [120, 121, 122] 
    ...: x = [1200, 1201, 1202] 
    ...: pts.extend(list(zip(y, x))) 
    ...: x = [1300, 1301, 1302] 
    ...: y = [130, 131, 132] 
    ...: pts.extend(list(zip(y, x))) 
    ...: 
In [626]: pts 
Out[626]: [(120, 1200), (121, 1201), (122, 1202), (130, 1300), (131, 1301), (132, 1302)] 
In [627]: y,x = list(zip(*pts)) 
In [628]: y 
Out[628]: (120, 121, 122, 130, 131, 132) 
In [629]: x 
Out[629]: (1200, 1201, 1202, 1300, 1301, 1302) 

Die chain Abflachung mit dem *zip transponieren kombiniert werden können, erstellt wurde, die Notwendigkeit einer Liste Verständnis zu beseitigen.

In [642]: pts 
Out[642]: 
[[(120, 1200), (121, 1201), (122, 1202)], 
[(130, 1300), (131, 1301), (132, 1302)]] 
In [643]: y,x=list(zip(*chain(*pts))) 
In [644]: y 
Out[644]: (120, 121, 122, 130, 131, 132) 
In [645]: x 
Out[645]: (1200, 1201, 1202, 1300, 1301, 1302) 
+0

extend wäre eine gute Wahl gewesen, aber ich muss auch die Fähigkeit beibehalten, Indizes (eine Menge von Punkten) später zu löschen. – DrTarr

Verwandte Themen