2017-02-23 10 views
0

I haben eine Liste von 2D-Koordinaten als NumPy Array, z.B.Numpy Äquivalent Reißverschluss mit gewalzten 2D-Array

x = np.asarray([[0, 1], 
       [1, 2], 
       [2, 3]]) 

von Form (3,2).

Jetzt möchte ich mit np.roll(x, 1) dieses Array zip-Paare zu erhalten Koordinatenlinien zu ziehen zwischen (einschließlich der Linie vom letzten zum ersten Element. Die Reihenfolge der Zeilen spielt keine Rolle.

Ich habe bereits eine Lösung mit dem Standard-Python Zip gefunden:

>>> np.asarray(list(zip(list(x[-1:]) + list(x[:-1]), x))) 
array([[[2, 3], 
     [0, 1]], 
     [[0, 1], 
     [1, 2]], 
     [[1, 2], 
     [2, 3]]]) 

Wie kann ich die numpy Funktionen ohne Umwandlung in Python-Listen, um dieses Ergebnis zu erhalten verwenden

Meine bisherigen Versuche es mit numPy tun gescheitert mise rably, zum Beispiel:

>>> np.dstack([x, np.roll(x, 1)]) 
array([[[0, 3], 
     [1, 0]], 

     [[1, 1], 
     [2, 1]], 

     [[2, 2], 
     [3, 2]]]) 

Edit: Dies ist kein Versuch, Kombinationen von x mit einem anderen Array zu erstellen, so dass die vorgeschlagene doppelt kein Duplikat ist.

Antwort

1

Ich verstehe nicht ganz, warum das gewünschte Ergebnis, aber hier ist die dstack Version, die Sie erhalten haben versucht:

>>> np.transpose(np.dstack([np.roll(x, 1, axis=0), x]), axes=(0,2,1)) 
array([[[2, 3], 
     [0, 1]], 

     [[0, 1], 
     [1, 2]], 

     [[1, 2], 
     [2, 3]]]) 
+0

Dank! Ich habe die Option "Achsen" komplett vermisst. Die Ausgabe bedeutet "zeichne Linie von (2,3) bis (0,1), zeichne Linie von (0,1) bis (1,2) usw.". Wenn x alle Punkte eines Polygons enthält, zeichnet dies das Polygon. –

+1

Ich versetze Achsen um zu transponieren, nicht um zu stapeln. – wim

+0

Oh ... deshalb habe ich es vermisst :-) Danke. Sicher habe ich etwas daraus gelernt! –

1

hier ein Ansatz ist mit einer solchen gewalzten Indizes erstellen und dann die Indizierung -

In [18]: x   # Input array 
Out[18]: 
array([[0, 1], 
     [1, 2], 
     [2, 3]]) 

In [19]: n = x.shape[0] 

In [20]: x[np.mod(np.arange(n)[:,None] + [n-1,0],n)] 
Out[20]: 
array([[[2, 3], 
     [0, 1]], 

     [[0, 1], 
     [1, 2]], 

     [[1, 2], 
     [2, 3]]]) 
Verwandte Themen