Diferença entre: e, em numpy

Oct 04 2020

Alguns recursos mencionaram que no numpycorte da matriz de array[2,:,1]resulta o mesmo que array[2][:][1], mas não obtenho os mesmos neste caso:

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

e:

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

Qual é a diferença?

Respostas

3 hpaulj Oct 04 2020 at 15:54

alguns recursos estão errados!

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]]])

Quando os índices são todos escalares, esse tipo de decomposição funciona:

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

Um índice reduz a dimensão, escolhendo um 'plano':

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

[:]sobre isso não faz nada - não é um marcador por si só. Dentro do índice multidimensional, é uma fatia - tudo nessa dimensão. Vemos o mesmo comportamento com listas. alist[2]retorna um elemento, alist[:]retorna uma cópia de toda a lista.

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

Lembre-se, numpyé um pacote python. A sintaxe do Python ainda se aplica a todos os níveis. x[a][b][c]faz 3 operações de indexação em sequência, 'encadeando-as'. x[a,b,c]é uma operação de indexação, passando uma tupla de para x. É um código numpy que interpreta essa tupla.

Temos que usar um índice multidimensional nas dimensões restantes:

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

O intérprete realmente faz:

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])