En Python NumPy, ¿qué es una dimensión y un eje?

82

Estoy codificando con el NumPymódulo Pythons . Si las coordenadas de un punto en el espacio 3D se describen como [1, 2, 1], ¿no serían tres dimensiones, tres ejes, un rango de tres? O si esa es una dimensión, ¿no deberían ser puntos (plural), no puntos?

Aquí está la documentación:

En Numpy las cotas se llaman ejes. El número de ejes es rango. Por ejemplo, las coordenadas de un punto en el espacio 3D [1, 2, 1] es una matriz de rango 1, porque tiene un eje. Ese eje tiene una longitud de 3.

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

davidjhp
fuente

Respuestas:

97

En numpy arrays, dimensionalidad se refiere al número de elementos axesnecesarios para indexarlo, no a la dimensionalidad de cualquier espacio geométrico. Por ejemplo, puede describir las ubicaciones de puntos en el espacio 3D con una matriz 2D:

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

Que tiene shapede (4, 3)y dimensión 2. Pero puede describir el espacio 3D porque la longitud de cada fila ( axis1) es tres, por lo que cada fila puede ser el componente x, y, z de la ubicación de un punto. La longitud de axis0 indica el número de puntos (aquí, 4). Sin embargo, eso es más una aplicación a las matemáticas que describe el código, no un atributo de la matriz en sí. En matemáticas, la dimensión de un vector sería su longitud (por ejemplo, componentes x, y, z de un vector 3d), pero en números, cualquier "vector" se considera realmente una matriz 1d de longitud variable. A la matriz no le importa cuál es la dimensión del espacio (si lo hay) que se describe.

Puede jugar con esto y ver el número de dimensiones y forma de una matriz así:

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)

Las matrices pueden tener muchas dimensiones, pero se vuelven difíciles de visualizar por encima de dos o tres:

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
fuente
9

Es de rango uno, ya que necesita un índice para indexarlo. Que tiene un eje de la longitud 3, ya que el índice de indexación puede tomar tres valores diferentes: v[i], i=0..2.

Bálint Aradi
fuente
8

Simplemente pegue parte de la respuesta de esta respuesta :

En Numpy, dimensión , eje / ejes , forma están relacionados y, a veces, conceptos similares:

In [1]: import numpy as np

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

dimensión

En Matemáticas / Física , la dimensión o dimensionalidad se define informalmente como el número mínimo de coordenadas necesarias para especificar cualquier punto dentro de un espacio. Pero en Numpy , de acuerdo con el documento numpy , es lo mismo que axis / axes:

En Numpy las cotas se llaman ejes. El número de ejes es rango.

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

eje / ejes

los enésima coordenada para indexar arrayen Numpy. Y las matrices multidimensionales pueden tener un índice por eje.

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)

forma

describe cuántos datos a lo largo de cada eje disponible.

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

También puede utilizar el parámetro de eje en operaciones de grupo, en el caso de eje = 0 Numpy realiza la acción en elementos de cada columna, y si eje = 1, realiza la acción en filas.

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
fuente
3

Así es como lo entiendo. Un punto es un objeto 1D. Solo puede definir su posición. No tiene dimensiones. Una línea o superficie es un objeto 2D. Puede definirlo tanto por su posición como por su longitud o área respectivamente, por ejemplo, rectángulo, cuadrado, círculo. Un volumen es un objeto 3D. Puede definirlo por su posición, área de superficie / longitudes y volumen, por ejemplo, Esfera, Cubo.

A partir de esto, definirás un punto en NumPy por un solo eje (dimensión), independientemente del número de ejes matemáticos que uses. Para los ejes xey, un punto se define como [2,4], y para los ejes x, y y z, un punto se define como [2,4,6]. Ambos son puntos, por lo tanto 1D.

Para definir una línea, se necesitarán dos puntos. Esto requerirá alguna forma de "anidamiento" de los puntos en la segunda dimensión (2D). Como tal, una línea se puede definir usando xey solo como [[2,4], [6,9]] o usando x, y y z como [[2,4,6], [6,9,12 ]]. Para una superficie, simplemente requerirá más puntos para describirla, pero seguirá siendo un objeto 2D. Por ejemplo, un triángulo necesitará 3 puntos mientras que un rectángulo / cuadrado necesitará 4.

Un volumen requerirá 4 (un tetraedro) o más puntos para definirlo, pero aún manteniendo el 'anidamiento' de puntos en la tercera dimensión (3D).

Ludex
fuente