2010-11-18 12 views
3

Ich habe mplot3d (Teil von Matplotlib) für einige verschiedene 3D-Plotting verwendet, und es hat die Arbeit bewundernswert. Ich bin jedoch auf ein neues Problem gestoßen.Sortieren von Daten zum Plotten in mplot3d

Mplot3d erwartet, dass Daten in einer bestimmten Weise sortiert werden, um ein Drahtgitter zu zeichnen. Zum Beispiel mag es etwa wie folgt:

x = array([[1, 2, 3], 
      [1, 2, 3], 
      [1, 2, 3]]) 

y = array([[1, 1, 1], 
      [2, 2, 2], 
      [3, 3, 3]) 

wobei z einer Reihe von gleichen Abmessungen ist, dann, mit Daten zu jedem dieser Positionen im Raum entsprechen.

Leider sind meine Daten nicht so formatiert - jede zweite Zeile ist umgekehrt, weil die Daten durch Scannen in einem Rastermuster gesammelt werden.

So habe ich etwas mehr wie:

x = array([[1, 2, 3], 
      [3, 2, 1], 
      [1, 2, 3]]) 

Mein aktueller Ansatz ein sehr hässlich ist, Brute-Force „tut ein for-Schleife dann überprüfen, ob Sie in einer ungeraden Zeile sind oder nicht“, dass baut eine neues Array aus dem alten, aber ich hoffe, dass es einen eleganteren Weg gibt, dies zu tun. Der schwierige Teil ist, dass ich das Z-Array auf die gleiche Weise wie das X und Y neu anordnen muss, um sicherzustellen, dass die Daten, die mit jedem Punkt korrespondieren, erhalten bleiben.

Idealerweise hätte ich gerne etwas, das robust und speziell entworfen ist, um eine Reihe von 2D-Arrays zu sortieren, die beliebige zufällige Positionspunkte enthalten, aber selbst eine eher pythische Art zu tun, was ich bereits mache, wäre willkommen. Wenn ich es robuster machen könnte und nicht von diesem spezifischen Raster-Scan-Muster abhängig wäre, würde es mir auf lange Sicht wahrscheinlich Kopfschmerzen ersparen.

Antwort

2

Wenn ich Sie richtig verstehe, wollen Sie nur Folgendes tun: x[1::2, :] = x[1::2, ::-1].

Es gibt ein paar Knicke ... Wenn Sie keine Zwischenkopie von x machen, tut es nicht ganz das, was Sie aufgrund der Art und Weise erwarten, wie Broadcasting in numpy funktioniert.

Dennoch ist es immer noch ziemlich einfach mit grundlegender Indizierung zu tun:

import numpy as np 
x = np.array([[1,2,3],[3,2,1],[1,2,3],[3,2,1],[1,2,3]]) 
x_rev = x.copy() 
x_rev[1::2, :] = x[1::2, ::-1] 

Dieser wandelt diese (x):

array([[1, 2, 3], 
     [3, 2, 1], 
     [1, 2, 3], 
     [3, 2, 1], 
     [1, 2, 3]]) 

In diesem (x_rev):

array([[1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3]]) 

Falls Sie mit dem Schneiden in Python nicht vertraut sind, x[1::2] würde jedes andere Element von x beginnend mit dem zweiten Element auswählen. (1 ist der Startindex, 2 ist das Inkrement) Im Gegensatz dazu gibt x[::-1] nur ein Inkrement von -1 an, wodurch das Array umgekehrt wird. In diesem Fall wenden wir diese Slices nur auf eine bestimmte Achse an, sodass wir jede zweite Zeile auswählen und umkehren können, beginnend mit der zweiten Zeile.

+0

Ich hatte etwas Erfahrung mit Slicing, hatte aber nicht an genau diese Vorgehensweise gedacht, obwohl es im Nachhinein offensichtlich scheint - danke! Ich versuche immer noch an eine clevere Art zu denken, eine Sortierung durchzuführen, die funktionieren würde, selbst wenn sich die Anordnung meiner Daten ändert, aber das hat weit weniger Priorität. – James

+0

@ user512679 - Nun, wenn Sie nur jede Zeile sortieren wollen, können Sie 'np.sort (x, axis = 1)' einfach machen –

Verwandte Themen