Informações: https://stackoverflow.com/questions/22053050/difference-between-numpy-array-shape-r-1-and-r
Este artigo é uma pergunta sobre stackoverflow que eu abri acidentalmente.É sobre o objeto array em numpy. Escusado será dizer que a posição importante do numpy no mundo do python e do aprendizado de máquina. Traduza esta resposta aqui para compreendê-la para aprendizado.
Nota: A tradução é apenas para fins de aprendizado.O autor é Gareth Rees e pode ter minhas próprias modificações.
Apenas para fins de aprendizado !!!
A melhor maneira de observar as matrizes NumPy é dividi-las em duas partes: um buffer de dados contém um elemento bruto (elemento original) e uma exibição (eu chamo de janela) para descrever e interpretar o buffer de dados.
Por exemplo, se se criar um contendo 12 inteiro matriz A :
>>> a = numpy.arange (12) >>> uma matriz ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
Em seguida, a contém um buffer de dados, armazenado da seguinte maneira:
┌────┬────────┬────────┬────┬────────────────────────── ┬────┬──── │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────┴─── ─┴────┴─────────────┴────────┴─────────────────────
E uma janela que define como interpretar os dados:
>>> a.flags C_CONTIGUOUS: True F_CONTIGUOUS: True OWNDATA: True gravável: True ALINHADOS: True UPDATEIFCOPY: False >>> a.dtype dtipo ( 'int64') >>> a.itemsize 8 >>> a.strides ( 8,) >>> a.shape (12,)
Aqui, shape = (12,) significa que a matriz é dominada por apenas um índice: de 0 a 11. Conceitualmente, se usarmos este índice separado para uma etiqueta marcada, em seguida, uma ficaria assim:
i = 0 1 2 3 4 5 6 7 8 9 10 11 ┌────┬────┬────┬───┬────────────┬────────┬ ────┬────┬────┬────────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────────┴────────┴────┴────────────────────────── ┴────┴────┘
A operação de remodelar uma matriz não altera o buffer de dados, mas cria uma nova janela para interpretar os dados.
>>> b = a.reshape ((3, 4))
A operação acima cria um b que possui o mesmo buffer de dados que a , mas agora é dominado por duas dimensões indexadas. Um de 0 a 2 e um de 0 a 3. Se rotularmos os dados, b terá a seguinte aparência:
i = 0 0 0 0 1 1 1 1 2 2 2 2 j = 0 1 2 3 0 1 2 3 0 1 2 3 ┌────┬────┬────┬────┬─ ───┬────┬────┬────────┬────┬─────────────────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │─────────┴─────────┴────┴─────────────────┴ ────┴────┴────┴────┴────┘
Isso também significa:
>>> b [2,1] 9
O segundo índice muda mais rápido que o primeiro.Para reverter, você pode usar os seguintes parâmetros para criar uma matriz c
>>> c = a.reshape ((3, 4), ordem = 'F')
Suplemento: order = 'F' ou order = 'C' significa que a indexação de matrizes é semelhante à linguagem C ou Fortran, respectivamente, e 'C' é o padrão
Isso produzirá uma matriz com os seguintes índices:
i = 0 1 2 0 1 2 0 1 2 0 1 2 j = 0 0 0 1 1 1 2 2 2 3 3 3 ┌────┬────┬────┬────┬─ ───┬────┬────┬────────┬────┬─────────────────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │─────────┴─────────┴────┴─────────────────┴ ────┴────┴────┴────┴────┘
Significado
>>> c [2,1] 5
Com a roupa de cama anterior, é fácil entender o seguinte exemplo:
>>> d = a.reshape ((12, 1))
A matriz d é dominada por dois índices, o primeiro índice é de 0 a 11 e o segundo índice é sempre 0:
i = 0 1 2 3 4 5 6 7 8 9 10 11 j = 0 0 0 0 0 0 0 0 0 0 0 0 0 ┌────┬────┬────┬────┬─ ───┬────┬────┬────────┬────┬─────────────────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │─────────┴─────────┴────┴─────────────────┴ ────┴────┴────┴────┴────┘
Então:
>>> d [10,0] 10
Uma matriz unidimensional achatada é livre em certo sentido, para que possamos definir o tamanho de cada dimensão:
>>> e = a.reshape ((1, 2, 1, 6, 1))
A operação acima cria uma matriz como esta:
i = 0 0 0 0 0 0 0 0 0 0 0 j = 0 0 0 0 0 1 1 1 1 1 1 k = 0 0 0 0 0 0 0 0 0 0 0 0 0 l = 0 1 2 3 4 5 0 1 2 3 4 5 m = 0 0 0 0 0 0 0 0 0 0 0 0 ┌────┬────┬─────────┬────┬──── ┬────┬────┬────┬────────┬────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────────┴────┴───┴────────────┴────┴─────── ─┴────┴────┴────┘
Então:
>>> e [0,1,0,0,0] 6