Was ist in Python NumPy eine Dimension und Achse?

82

Ich codiere mit dem Pythons- NumPyModul. Wenn die Koordinaten eines Punktes im 3D-Raum wie folgt beschrieben werden [1, 2, 1], wären das nicht drei Dimensionen, drei Achsen, ein Rang von drei? Oder wenn das eine Dimension ist, sollten es dann nicht Punkte (Plural) sein, nicht Punkte?

Hier ist die Dokumentation:

In Numpy werden Dimensionen als Achsen bezeichnet. Die Anzahl der Achsen ist Rang. Beispielsweise sind die Koordinaten eines Punktes im 3D-Raum [1, 2, 1] ein Array mit Rang 1, da es eine Achse hat. Diese Achse hat eine Länge von 3.

Quelle: http://wiki.scipy.org/Tentative_NumPy_Tutorial

davidjhp
quelle

Antworten:

96

In numpy arrays bezieht sich die Dimensionalität auf die Anzahl der axeszum Indizieren erforderlichen Dimensionen, nicht auf die Dimensionalität eines geometrischen Raums. Beispielsweise können Sie die Positionen von Punkten im 3D-Raum mit einem 2D-Array beschreiben:

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

Welches hat shapevon (4, 3)und Dimension 2. Es kann jedoch den 3D-Raum beschreiben, da die Länge jeder Zeile ( axis1) drei beträgt, sodass jede Zeile die x-, y- und z-Komponente der Position eines Punkts sein kann. Die Länge axis0 gibt die Anzahl der Punkte an (hier 4). Dies ist jedoch eher eine Anwendung auf die Mathematik, die der Code beschreibt, als ein Attribut des Arrays selbst. In der Mathematik wäre die Dimension eines Vektors seine Länge (z. B. x-, y- und z-Komponenten eines 3d-Vektors), aber in numpy wird jeder "Vektor" wirklich nur als 1d-Array unterschiedlicher Länge betrachtet. Dem Array ist es egal, wie groß der beschriebene Raum (falls vorhanden) ist.

Sie können damit herumspielen und die Anzahl der Dimensionen und Formen eines Arrays wie folgt anzeigen:

In [262]: a = np.arange(9)

In [263]: a
Out[263]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])

In [264]: a.ndim    # number of dimensions
Out[264]: 1

In [265]: a.shape
Out[265]: (9,)

In [266]: b = np.array([[0,0,0],[1,2,3],[2,2,2],[9,9,9]])

In [267]: b
Out[267]: 
array([[0, 0, 0],
       [1, 2, 3],
       [2, 2, 2],
       [9, 9, 9]])

In [268]: b.ndim
Out[268]: 2

In [269]: b.shape
Out[269]: (4, 3)

Arrays können viele Dimensionen haben, aber über zwei oder drei sind sie schwer zu visualisieren:

In [276]: c = np.random.rand(2,2,3,4)

In [277]: c
Out[277]: 
array([[[[ 0.33018579,  0.98074944,  0.25744133,  0.62154557],
         [ 0.70959511,  0.01784769,  0.01955593,  0.30062579],
         [ 0.83634557,  0.94636324,  0.88823617,  0.8997527 ]],

        [[ 0.4020885 ,  0.94229555,  0.309992  ,  0.7237458 ],
         [ 0.45036185,  0.51943908,  0.23432001,  0.05226692],
         [ 0.03170345,  0.91317231,  0.11720796,  0.31895275]]],


       [[[ 0.47801989,  0.02922993,  0.12118226,  0.94488471],
         [ 0.65439109,  0.77199972,  0.67024853,  0.27761443],
         [ 0.31602327,  0.42678546,  0.98878701,  0.46164756]],

        [[ 0.31585844,  0.80167337,  0.17401188,  0.61161196],
         [ 0.74908902,  0.45300247,  0.68023488,  0.79672751],
         [ 0.23597218,  0.78416727,  0.56036792,  0.55973686]]]])

In [278]: c.ndim
Out[278]: 4

In [279]: c.shape
Out[279]: (2, 2, 3, 4)
askewchan
quelle
9

Es ist von Rang eins, da Sie einen Index benötigen, um es zu indizieren. Diese eine Achse hat die Länge 3, da die Indexindizierung drei verschiedene Werte annehmen kann : v[i], i=0..2.

Bálint Aradi
quelle
8

Fügen Sie einfach einen Teil der Antwort aus dieser Antwort ein :

In Numpy sind Dimension , Achse / Achse , Form verwandte und manchmal ähnliche Konzepte:

In [1]: import numpy as np

In [2]: a = np.array([[1,2],[3,4]])

Abmessungen

In Mathematik / Physik wird Dimension oder Dimensionalität informell als die Mindestanzahl von Koordinaten definiert, die erforderlich sind, um einen Punkt innerhalb eines Raums anzugeben. Aber in Numpy ist es laut Numpy Doc dasselbe wie Achse / Achsen:

In Numpy werden Dimensionen als Achsen bezeichnet. Die Anzahl der Achsen ist Rang.

In [3]: a.ndim  # num of dimensions/axes, *Mathematics definition of dimension*
Out[3]: 2

Achse / Achsen

die n-te Koordinate zum Indizieren eines arrayin Numpy. Mehrdimensionale Arrays können einen Index pro Achse haben.

In [4]: a[1,0]  # to index `a`, we specific 1 at the first axis and 0 at the second axis.
Out[4]: 3  # which results in 3 (locate at the row 1 and column 0, 0-based index)

gestalten

beschreibt, wie viele Daten entlang jeder verfügbaren Achse vorliegen.

In [5]: a.shape
Out[5]: (2, 2)  # both the first and second axis have 2 (columns/rows/pages/blocks/...) data
YaOzI
quelle
5

Sie können den Achsenparameter auch in Gruppenoperationen verwenden, wenn Achse = 0 ist. Numpy führt die Aktion für Elemente jeder Spalte aus. Wenn Achse = 1, führt sie die Aktion für Zeilen aus.

test = np.arange(0,9).reshape(3,3)

Out[3]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

test.sum(axis=0)
Out[5]: array([ 9, 12, 15])

test.sum(axis=1)
Out[6]: array([ 3, 12, 21])
Alex Granovsky
quelle
3

So verstehe ich es. Ein Punkt ist ein 1D-Objekt. Sie können nur seine Position definieren. Es hat keine Dimensionen. Eine Linie oder Fläche ist ein 2D-Objekt. Sie können es sowohl durch seine Position als auch durch seine Länge bzw. Fläche definieren, z. B. Rechteck, Quadrat, Kreis. Ein Volumen ist ein 3D-Objekt. Sie können es durch seine Position, Oberfläche / Länge und Volumen definieren, z. B. Kugel, Würfel.

Daraus definieren Sie einen Punkt in NumPy durch eine einzelne Achse (Dimension), unabhängig von der Anzahl der verwendeten mathematischen Achsen. Für die x- und y-Achse ist ein Punkt als [2,4] definiert, und für die x-, y- und z-Achse ist ein Punkt als [2,4,6] definiert. Beides sind Punkte, also 1D.

Um eine Linie zu definieren, werden zwei Punkte benötigt. Dies erfordert eine Form der Verschachtelung der Punkte in die zweite Dimension (2D). Als solche kann eine Linie nur unter Verwendung von x und y als [[2,4], [6,9]] oder unter Verwendung von x, y und z als [[2,4,6], [6,9,12] definiert werden ]]. Für eine Oberfläche sind lediglich mehr Punkte erforderlich, um sie zu beschreiben, es bleibt jedoch ein 2D-Objekt. Zum Beispiel benötigt ein Dreieck 3 Punkte, während ein Rechteck / Quadrat 4 Punkte benötigt.

Ein Volumen benötigt 4 (ein Tetraeder) oder mehr Punkte, um es zu definieren, behält jedoch die Verschachtelung von Punkten in der dritten Dimension (3D) bei.

Ludex
quelle