Das speichern von Informationen auf Punkte im 3d-Raum
Bin ich einige code schreiben (nur zum Spaß so weit) in Python, die speichern einige Daten über jeden Punkt in einem 3d-Raum. Ich bin im Grunde nach einer 3d-matrix-Objekt, das speichert willkürliche Objekte, mit denen ich zu tun, einige erweiterte Auswahl, wie:
- Bekommen der Punkt, wo x=1,y=2,z=3.
- Immer alle Punkte, wo y=2.
- Immer alle Punkte innerhalb von 3 Einheiten der position x=1,y=2,z=3.
- Immer alle Punkte, wo Punkt.getType() == "Foo"
In allen der oben genannten, ich würde müssen, um am Ende mit irgendeiner Art von Ausgabe, würde mir die Originale position in den Raum, und die gespeicherten Daten an diesem Punkt.
Offenbar numpy kann tun was ich will, aber es scheint hoch optimiert für wissenschaftliches rechnen und arbeiten heraus, wie man die Daten möchte ich über bisher entzog sich mir.
Gibt es eine bessere alternative oder sollte ich zurück, schlug mein Kopf auf die numpy Wand? 🙂
EDIT: ein paar mehr Infos zu den ersten drei Antworten, die mir klar gemacht, ich sollte mir gehören: ich bin nicht besorgt über die Leistung, dies ist lediglich ein proof-of-concept, wo ich lieber sauberen code, um eine gute Leistung. Ich habe auch Daten für jeden Punkt in der gegebenen 3d-Raum, so dass ich denke, ein Ersatz-Matrix ist schlecht?
- Ja, verwenden Sie einfach ein 3D-array, komplexere Strukturen sind nur für die Optimierung für einige Vorgänge in einige konkrete Fälle.
- wenn Sie sagen, "points in space", ich nehme an, dass x,y,x sind kontinuierliche Variablen, z.B. Schwimmern, aber dein Beispiel impliziert ints. Wenn ints, eine sparse-matrix ist ok. Ansonsten benutzen Sie Tupel oder Objekte. Persönlich würde ich empfehlen den Aufstieg über den numpy Wand. Es ist grüne Weide auf der anderen Seite!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine weitere gemeinsame Ansatz
Schauen wir uns Ihren Einsatz-Fälle.
Bekommen der Punkt, wo x=1,y=2,z=3.
Immer alle Punkte, wo y=2.
Immer alle Punkte innerhalb von 3 Einheiten der position x=1,y=2,z=3.
Immer alle Punkte, wo Punkt.getType() == "Foo"
Gut ... Wenn Sie erwarten, um wirklich füllen, dass der Raum, dann sind Sie wahrscheinlich am besten aus, mit einer dicht gepackten matrix-Struktur, im Grunde voxels.
Wenn Sie nicht erwarten, um ihn zu füllen, schauen Sie in etwas ein bisschen mehr optimiert. Ich würde beginnen Sie mit octrees, die Häufig verwendet werden, für Dinge wie diese.
Einer der Vorteile von numpy ist, dass es rasend schnell,
z.B. die Berechnung des pagerank einer 8000x8000 Nähe matrix dauert Millisekunden. Obwohl
numpy.ndarray
akzeptieren nur zahlen, Sie können die store-Nummer/id-Objekt-mappings in einer externen hash-Tabelle, D. H. Wörterbuch (wieder ein hoch optimiertes datastructure).Dem slicing-einfach als Liste slicing in python:
Wenn Sie wickeln einige der gewünschten Funktionen (Entfernungen), um einige Kern-matrix und ein id-Objekt-mapping-hash, Sie haben könnte, Ihre Anwendung innerhalb kurzer Zeit.
Glück!
matrix stuff
; Matrizen sind, würde ich nicht sagen Spaß, aber Recht ordentlich. und für Ihre slicing -, Zugang, diendarray
ist groß - warum also nicht nutzen?Hier ist ein Ansatz, die arbeiten dürfen.
Jeder Punkt ist ein 4-Tupel (x,y,z,Daten), und die Datenbank sieht so aus:
Schauen wir uns Ihren Einsatz-Fälle.
Bekommen der Punkt, wo x=1,y=2,z=3.
Immer alle Punkte, wo y=2.
Immer alle Punkte innerhalb von 3 Einheiten der position x=1,y=2,z=3.
Immer alle Punkte, wo Punkt.getType() == "Foo"
Können Sie die ersten 2 Abfragen mit slicing in numpy :
Für die Dritte, wenn du meinst "immer alle Punkte innerhalb einer Kugel mit radius 3 und zentriert bei x=1,y=2,z=3" Sie haben zu schreiben, eine benutzerdefinierte Funktion zu tun ; wenn Sie möchten ein cube können Sie mit slicing, z.B.:
Für die vierte Abfrage, wenn nur die Daten gespeichert, in deinem array sind die Zellen geben, könnte man Sie verschlüsseln, wie ganze zahlen:
numpy sieht aus wie ein gutes Programm für Sie tun, was Sie wollen, wie die Felder werden kleiner Speicher, der leicht zugänglich in C (oder noch besser, cython !) und erweiterte slicing-syntax, werden Sie zu vermeiden, code zu schreiben.
Verwenden ein Wörterbuch mit x,y,z Tupel als Schlüssel ist eine weitere Lösung, wenn Sie möchten, eine relativ einfache Lösung mit der standard-Bibliothek.
Und durch python-Referenzierung, den Sie verändern können "Punkte" in der zurückgegebenen Wörterbücher, und die ursprünglichen Punkte ändern sich auch (glaube ich).
Wann Binary Space Partitioning, Quadtree, Octree?
3d-array imo wertlos ist. Vor allem, wenn Ihre Welt ist dynamisch. Sollten Sie sich entscheiden, zwischen BSP, Quadtree oder Octtree. BSP wäre genau richtig. Seit Sie Ihre Welt in 3d, müssen Sie Flugzeuge bei einer Aufteilung der bsp, nicht auf Zeilen.
Prost !
Bearbeiten
Ich denke, das ist in Ordnung, wenn Sie immer wissen, wie groß Sie Daten festgelegt ist, und dass es sich nie ändert, d.h. wenn mehr Punkte Hinzugefügt werden, dass wiederum sind gebunden. Sie hätte, um die Größe des 3d-array in diesem Fall.
Es hängt von der genauen Konfiguration Ihres Systems, aber von dem Beispiel, das Sie geben, Sie sind mit ganzen zahlen und diskreten Punkten, so wäre es wohl angebracht zu überlegen, Sparse Matrix Datenstrukturen.