Pular para o conteúdo

    Capítulo 6, Básico

    Anatomia de um array

    Antes de transformar um array, aprenda a ler o que ele diz sobre si mesmo. Toda a informação importante está em meia dúzia de atributos.

    Código deste capítulo: básico/cap06_anatomia.py

    Os atributos

    básico/cap06_anatomia.pylinhas 10 a 16
    import numpy as np
    
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr.shape, arr.ndim, arr.size)
    print(arr.dtype, arr.itemsize, arr.nbytes)
    print(arr.T)
    print(arr.strides)
    
    Saída
    (2, 3) 2 6
    int64 8 48
    [[1 4]
     [2 5]
     [3 6]]
    (24, 8)
    
    AtributoSignificaNo exemplo
    shapeAs dimensões, como tupla(2, 3): 2 linhas e 3 colunas
    ndimQuantas dimensões2
    sizeQuantos elementos no total6
    dtypeO tipo de todos os elementosint64
    itemsizeBytes por elemento8
    nbytesBytes no total (size * itemsize)48
    TA transposta (linhas viram colunas)Uma visão, sem copiar
    stridesBytes a pular para ir ao próximo elemento em cada eixo(24, 8)

    O strides é o detalhe interno que torna o fatiamento tão rápido: para andar uma linha, o NumPy pula 24 bytes (3 elementos de 8 bytes), e para andar uma coluna, pula 8. Você não precisa calculá-lo, mas o capítulo 29 mostra como ele permite criar "visões" sem copiar dados.

    Forma não é tamanho

    O erro mais frequente de quem começa é trocar shape por size. Eles respondem a perguntas diferentes: o shape diz como os elementos estão organizados, e o size diz quantos são. Um array de forma (4, 5) tem tamanho 20.

    Um array de uma dimensão tem forma de um elemento, e é preciso a vírgula na tupla. E há arrays de zero dimensões (escalares), cuja forma é a tupla vazia:

    básico/cap06_anatomia.pylinha 21
    print(len(arr), np.array([1, 2, 3]).shape, np.array(5).shape, np.array(5).ndim)
    
    Saída
    2 (3,) () 0
    

    O len(arr) devolve apenas o tamanho da primeira dimensão (2 linhas). Para o total de elementos, use size.

    Por que o dtype importa mais do que parece

    Um milhão de float64 ocupa o dobro da memória do mesmo milhão em float32. Em um conjunto de dados de brinquedo isso é irrelevante, mas quando o conjunto cresce para centenas de milhões de valores, escolher o tipo certo decide se ele cabe na memória. O próximo capítulo trata disso.

    Exercício 1

    Um resumo de qualquer array

    Escreva resumo(a) que devolva um dicionário com forma, dimensoes, tamanho e bytes de um array. Teste com np.zeros((4, 5)).