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
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)
(2, 3) 2 6
int64 8 48
[[1 4]
[2 5]
[3 6]]
(24, 8)
| Atributo | Significa | No exemplo |
|---|---|---|
shape | As dimensões, como tupla | (2, 3): 2 linhas e 3 colunas |
ndim | Quantas dimensões | 2 |
size | Quantos elementos no total | 6 |
dtype | O tipo de todos os elementos | int64 |
itemsize | Bytes por elemento | 8 |
nbytes | Bytes no total (size * itemsize) | 48 |
T | A transposta (linhas viram colunas) | Uma visão, sem copiar |
strides | Bytes 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:
print(len(arr), np.array([1, 2, 3]).shape, np.array(5).shape, np.array(5).ndim)
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
float64ocupa o dobro da memória do mesmo milhão emfloat32. 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)).