web-dev-qa-db-fra.com

Que fait Numpy Ndarray?

J'ai une question simple à propos de la fonction .shape, qui m'a beaucoup dérouté.

a = np.array([1, 2, 3])   # Create a rank 1 array
print(type(a))            # Prints "<class 'numpy.ndarray'>"
print(a.shape)            # Prints "(3,)"

b = np.array([[1,2,3],[4,5,6]])    # Create a rank 2 array
print(b.shape)                     # Prints "(2, 3)"

Que fait exactement la forme. Comptez combien de lignes, combien de colonnes, alors la forme a supposée être, (1,3), une ligne trois colonnes, non?

24
Pumpkin C

yourarray.shape ou np.shape() ou np.ma.shape() renvoie la forme de votre ndarray sous la forme d'un Tuple; Et vous pouvez obtenir le (nombre de) dimensions de votre tableau en utilisant yourarray.ndim ou np.ndim(). (c’est-à-dire qu’il donne la n de la ndarray puisque tous les tableaux de NumPy ne sont que des tableaux à n dimensions (appelé brièvement ndarrays))

Pour un tableau 1D, la forme serait _(n,)_ où n est le nombre d'éléments de votre tableau.

Pour un tableau 2D, la forme serait _(n,m)_ où n est le nombre de lignes et m est le nombre de colonnes de votre tableau.

Veuillez noter que dans 1D , la forme serait simplement _(n, )_ au lieu de ce que vous avez déclaré soit _(1, n)_ ou _(n, 1)_ pour les vecteurs de lignes et de colonnes, respectivement.

Ceci est conforme à la convention qui:

Pour un tableau 1D, retournez un élément shape Tuple avec uniquement 1 (c'est-à-dire _(n,)_)
Pour un tableau 2D, retourne un élément de forme avec uniquement 2 éléments (c'est-à-dire _(n,m)_)
Pour un tableau 3D, retournez un élément de forme avec seulement éléments (c'est-à-dire _(n,m,k)_)
Pour le tableau 4D, retourne un élément de forme avec seulement 4 éléments (c'est-à-dire _(n,m,k,j)_)

etc.

Voir aussi l'exemple ci-dessous pour voir comment np.shape() ou np.ma.shape() se comporte avec 1D tableaux et scalaires:

_# sample array
In [10]: u = np.arange(10)

# get its shape
In [11]: np.shape(u)    # u.shape
Out[11]: (10,)

# get array dimension using `np.ndim`
In [12]: np.ndim(u)
Out[12]: 1

In [13]: np.shape(np.mean(u))
Out[13]: ()       # empty Tuple (to indicate that a scalar is a 0D array).

# check using `numpy.ndim`
In [14]: np.ndim(np.mean(u))
Out[14]: 0
_

PS : Ainsi, le forme de nuplet ​​est cohérent ​​avec notre compréhension des dimensions de l'espace, à moins mathématiquement.

39
kmario23

À la différence de son concurrent commercial le plus populaire, numpy traite presque dès le départ des tableaux "à dimensions arbitraires". C'est pourquoi la classe de base s'appelle ndarray. Vous pouvez vérifier la dimensionnalité d'un tableau numpy à l'aide de la propriété .ndim. La propriété .shape est un tuple de longueur .ndim contenant la longueur de chaque dimension. Actuellement, numpy peut gérer jusqu'à 32 dimensions:

a = np.ones(32*(1,))
a
# array([[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ 1.]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]])
a.shape
# (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
a.ndim
# 32

Si un tableau numpy se trouve être 2d comme votre deuxième exemple, il convient de le penser en termes de lignes et de colonnes. Mais un tableau 1d dans numpy est vraiment 1d, pas de lignes ni de colonnes.

Si vous voulez quelque chose comme un vecteur ligne ou colonne, vous pouvez y parvenir en créant un tableau 2D avec une de ses dimensions égale à 1.

a = np.array([[1,2,3]]) # a 'row vector'
b = np.array([[1],[2],[3]]) # a 'column vector'
# or if you don't want to type so many brackets:
b = np.array([[1,2,3]]).T
3
Paul Panzer