Différence entre: et, dans numpy

Oct 04 2020

Certaines ressources ont mentionné que dans numpyle découpage de tableau de, les array[2,:,1]résultats sont les mêmes que array[2][:][1], mais je n'obtiens pas les mêmes dans ce cas:

array3d = np.array([[[1, 2], [3, 4]],[[5, 6], [7, 8]], [[9, 10], [11, 12]]])
array3d[2,:,1]
out: array([10, 12])

et:

array3d[2][:][1]
out: array([11, 12])

Quelle est la différence?

Réponses

3 hpaulj Oct 04 2020 at 15:54

certaines ressources sont fausses!

In [1]: array3d = np.array([[[1, 2], [3, 4]],[[5, 6], [7, 8]], [[9, 10], [11, 12
   ...: ]]])
In [2]: array3d
Out[2]: 
array([[[ 1,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]],

       [[ 9, 10],
        [11, 12]]])

Lorsque les indices sont tous scalaires, ce type de décomposition fonctionne:

In [3]: array3d[2,0,1]
Out[3]: 10
In [4]: array3d[2][0][1]
Out[4]: 10

Un index réduit la dimension, en choisissant un `` plan '':

In [5]: array3d[2]
Out[5]: 
array([[ 9, 10],
       [11, 12]])

[:]sur cela ne fait rien - ce n'est pas un espace réservé en soi. Dans l'index multidimensionnel, c'est une tranche - le tout dans cette dimension. Nous constatons le même comportement avec les listes. alist[2]renvoie un élément, alist[:]retourne une copie de la liste entière.

In [6]: array3d[2][:]
Out[6]: 
array([[ 9, 10],
       [11, 12]])

Rappelez-vous, numpyest un package python. La syntaxe Python s'applique toujours à tous les niveaux. x[a][b][c]effectue 3 opérations d'indexation en séquence, les «enchaînant». x[a,b,c]est une opération d'indexation, en passant un tuple de to x. C'est du code numpy qui interprète ce tuple.

Nous devons utiliser un index multidimensionnel sur les dimensions restantes:

In [7]: array3d[2][:,1]
Out[7]: array([10, 12])
In [8]: array3d[2,:,1]
Out[8]: array([10, 12])

L'interprète fait en fait:

In [9]: array3d.__getitem__((2,slice(None),1))
Out[9]: array([10, 12])

In [11]: array3d.__getitem__(2).__getitem__((slice(None),1))
Out[11]: array([10, 12])