Pular para o conteúdo principal

Tutorial de array NumPy em Python

Um tutorial de NumPy para iniciantes no qual você vai aprender a criar um array NumPy, usar broadcasting, acessar valores, manipular arrays e muito mais.
Atualizado 17 de set. de 2026  · 15 min lido

Explorar com IA

ChatGPTClaudePerplexity

NumPy é, assim como SciPy, Scikit-Learn, pandas e pacotes semelhantes. Eles são bibliotecas de Python que você não pode deixar de conhecer quando está aprendendo ciência de dados, principalmente porque esta biblioteca oferece uma estrutura de dados de array que traz vantagens em relação às listas de Python, como ser mais compacta, ter acesso de leitura e escrita mais rápido, ser mais prática e mais eficiente.

Este conteúdo sobre NumPy vai focar exatamente nisso. Ele não só vai mostrar o que são os arrays do NumPy e como você pode instalar o Python, mas também como criar arrays (inclusive quando os dados vêm de arquivos), como o broadcasting funciona, como pedir ajuda, como manipular seus arrays e como visualizá-los.

Se quiser ir ainda mais a fundo em arrays do NumPy e nas outras estruturas de dados que você vai precisar na sua jornada em ciência de dados, dê uma olhada no Intro to Python for Data Science da DataCamp, que tem um capítulo sobre NumPy.

O que é um array NumPy em Python?

Você já leu na introdução que arrays do NumPy lembram listas de Python, mas ao mesmo tempo são bem diferentes. Para quem é novo no tema, vamos esclarecer exatamente o que é e para que serve.

Como o nome indica, um array NumPy é uma estrutura de dados central da biblioteca numpy. O nome da biblioteca é abreviação de “Numeric Python” ou “Numerical Python”.

Em outras palavras, NumPy é a biblioteca base para computação científica em Python. Ela reúne ferramentas e técnicas que podem ser usadas para resolver modelos matemáticos de problemas em ciência e engenharia.

Uma dessas ferramentas é um objeto de array multidimensional de alto desempenho, uma poderosa estrutura de dados para computação eficiente com arrays e matrizes. Para trabalhar com esses arrays, há uma grande quantidade de funções matemáticas de alto nível que operam sobre essas matrizes e arrays.

Mas o que é um array?

Ao imprimir alguns arrays, você pode vê-los como uma grade que contém valores do mesmo tipo:

import numpy as np
# Define a 1D array
my_array = np.array([[1, 2, 3, 4],
                     [5, 6, 7, 8]],
                    dtype=np.int64)
# Define a 2D array
my_2d_array = np.array([[1, 2, 3, 4],
                        [5, 6, 7, 8]],
                       dtype=np.int64)
# Define a 3D array
my_3d_array = np.array([[[1, 2, 3, 4],
                         [5, 6, 7, 8]],
                        [[1, 2, 3, 4],
                         [9, 10, 11, 12]]],
                       dtype=np.int64)
# Print the 1D array
print("Printing my_array:")
print(my_array)
# Print the 2D array
print("Printing my_2d_array:")
print(my_2d_array)
# Print the 3D array
print("Printing my_3d_array:")
print(my_3d_array)

No exemplo acima, os dados são inteiros. O array armazena e representa dados regulares de forma estruturada.

No entanto, vale saber que, no nível estrutural, um array é basicamente um conjunto de ponteiros. É a combinação de um endereço de memória, um tipo de dado, um formato (shape) e strides:

  • O ponteiro de dados indica o endereço de memória do primeiro byte no array.
  • O tipo de dado, ou dtype, descreve o tipo de elementos contidos no array.
  • O shape indica o formato do array.
  • Os strides são o número de bytes que devem ser “pulados” na memória para ir ao próximo elemento. Se seus strides são (10,1), você precisa avançar um byte para ir à próxima coluna e 10 bytes para chegar à próxima linha.

Ou seja, um array contém informações sobre os dados brutos, como localizar um elemento e como interpretá-lo.

Chega de teoria. Vamos conferir na prática:

Você pode testar facilmente explorando os atributos de um array do numpy:

import numpy as np
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print out memory address
print(my_2d_array.data)

# Print out the shape of `my_array`
print(my_2d_array.shape)

# Print out the data type of `my_array`
print(my_2d_array.dtype)

# Print out the stride of `my_array`
print(my_2d_array.strides)

Agora você obtém muito mais informação: por exemplo, o tipo de dado impresso é ‘int64’; Isso é bem mais detalhado! Isso também significa que o array está armazenado em 64 bytes (cada inteiro ocupa 8 bytes e você tem um array com 8 inteiros). Os strides do array indicam que é preciso pular 8 bytes (um valor) para ir à próxima coluna e 32 bytes (4 valores) para chegar à mesma posição na próxima linha. Assim, os strides do array serão (32,8).

Note que, se você definir o tipo de dado como int32, a tupla de strides será (16, 4), pois você ainda precisará avançar um valor para a próxima coluna e 4 valores para a mesma posição na próxima linha. A única mudança é que cada inteiro passa a ocupar 4 bytes em vez de 8.

Numpy Array Axis

O array acima é, como o nome sugere, bidimensional: há linhas e colunas. As linhas são indicadas como “eixo 0” (axis 0), enquanto as colunas são o “eixo 1” (axis 1). A numeração de eixos cresce conforme as dimensões: em arrays 3D, como no exemplo anterior, você terá um “eixo 2” adicional. Note que esses eixos só fazem sentido para arrays com pelo menos 2 dimensões; não há por que tê-los em arrays 1D.

Esses eixos serão muito úteis depois, quando você for manipular o shape dos seus arrays NumPy.

Como instalar o NumPy

Antes de começar a testar os arrays do NumPy, você precisa garantir que ele está instalado localmente (assumindo que você está no seu computador). Se a biblioteca Python já está disponível, pode pular esta seção :)

Se ainda precisa configurar seu ambiente, saiba que há duas formas principais de instalar o NumPy no seu PC: com Python wheels ou com a distribuição Anaconda.

Instalar com Python Wheels

Primeiro, confirme que você tem Python instalado. Você pode consultar nosso guia de como instalar Python se ainda não fez isso :)

Se você está no Windows, certifique-se de ter adicionado o Python à variável de ambiente PATH. Depois, não esqueça de instalar um gerenciador de pacotes, como o pip, que garante o uso de bibliotecas open source do Python.

Versões recentes do Python 3 já vêm com o pip. Verifique se você tem o pip e, se tiver, atualize antes de instalar o NumPy:

pip install pip --upgrade
pip --version
Baixe o arquivo wheel do NumPy adequado ao seu sistema no site do PyPI. Você encontra a lista de wheels disponíveis na Python Package Index.
 
Depois de baixar o arquivo wheel do NumPy, navegue até o diretório onde ele foi salvo usando o prompt de comando ou o terminal.
 
Instale o NumPy com o comando abaixo, substituindo "numpy-<version>-<architecture>.whl" pelo nome do arquivo wheel que você baixou:
pip install numpy-<version>-<architecture>.whl
Por exemplo, se você baixou o NumPy versão 1.20.3 para Windows 64 bits, o comando seria:
pip install numpy-1.20.3-cp39-cp39-win_amd64.whl
Após concluir a instalação, você pode verificar se o NumPy está instalado abrindo o interpretador Python e executando o comando:
import numpy
Se não aparecer nenhuma mensagem de erro, o NumPy está instalado e pronto para uso!

Instalar com a distribuição Anaconda

Para obter o NumPy, você também pode baixar a distribuição Anaconda. É simples e permite começar rapidinho! Se ainda não baixou, acesse a página oficial e faça o download. Siga as instruções de instalação e pronto!

Por que isso pode ser mais fácil?

O bom de usar essa distribuição é que você não precisa se preocupar em instalar separadamente o NumPy ou qualquer outro pacote importante que vai usar nas suas análises, como pandas, scikit-learn etc.

Especialmente se você é iniciante em Python, programação ou terminal, é um alívio saber que o Anaconda já inclui 100 dos pacotes mais populares de Python, R e Scala para ciência de dados. E mesmo para profissionais mais experientes, Anaconda é o caminho se você quer começar a resolver problemas rápido.

Além disso, o Anaconda inclui vários ambientes de desenvolvimento open source, como Jupyter e Spyder. Se quiser começar a trabalhar com Jupyter Notebook depois deste tutorial, confira nosso tutorial de Jupyter Notebook.

Resumindo, considere baixar o Anaconda para começar a trabalhar com numpy e outros pacotes relevantes para ciência de dados!

Como criar arrays NumPy

Agora que você configurou seu ambiente, é hora de partir para a prática. Você já testou algumas coisas com arrays no código acima, mas ainda não colocou a mão na massa de verdade porque precisava instalar o NumPy. Com isso resolvido, vamos ver o que fazer para rodar os trechos de código por conta própria.

Para criar um array do numpy, basta usar a função np.array(). Você só precisa passar uma lista, e opcionalmente pode especificar o tipo de dado. Se quiser saber mais sobre os tipos disponíveis, veja este guia ou dê uma olhada no cheat sheet de NumPy da DataCamp.

Não é preciso decorar os tipos do NumPy se você está começando, mas é essencial saber com que dados está lidando. Os tipos servem quando você precisa de mais controle sobre como os dados são armazenados em memória e em disco. Principalmente quando trabalha com muitos dados, é importante controlar o tipo de armazenamento.

Não esqueça que, para usar a função np.array(), a biblioteca numpy precisa estar presente no seu ambiente.

O NumPy segue uma convenção de importação: quando importar, use o alias np. Assim, outros Pythonistas entendem seu código com mais facilidade.

No exemplo a seguir, você vai criar o array my_array com o qual já interagiu acima:

import numpy as np

# Make the array `my_array`
my_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print `my_array`
print(my_array)

Se quiser saber mais sobre como criar listas, confira nosso tutorial de perguntas comuns sobre listas em Python.

Às vezes você não sabe quais dados quer colocar no array, ou quer importar dados para um array do numpy a partir de outra fonte. Nesses casos, você pode usar placeholders iniciais ou funções para carregar dados de texto em arrays.

As seções a seguir mostram como fazer isso.

Como criar um array NumPy “vazio”

Quando as pessoas dizem que estão criando arrays “vazios”, geralmente querem usar placeholders iniciais, que podem ser preenchidos depois. Você pode inicializar arrays com uns (ones) ou zeros, mas também criar arrays preenchidos com valores igualmente espaçados, constantes ou aleatórios.

Ainda assim, também dá para criar um array totalmente vazio.

Felizmente, há várias funções para isso.

Teste tudo abaixo!

import numpy as np

# Create an array of ones
ones_array = np.ones((3, 4))
print("Ones Array:")
print(ones_array)
print()

# Create an array of zeros
zeros_array = np.zeros((2, 3, 4), dtype=np.int16)
print("Zeros Array:")
print(zeros_array)
print()

# Create an array with random values
random_array = np.random.random((2, 2))
print("Random Array:")
print(random_array)
print()

# Create an empty array
empty_array = np.empty((3, 2))
print("Empty Array:")
print(empty_array)
print()

# Create a full array
full_array = np.full((2, 2), 7)
print("Full Array:")
print(full_array)
print()

# Create an array of evenly-spaced values
arange_array = np.arange(10, 25, 5)
print("Arange Array:")
print(arange_array)
print()

# Create an array of evenly-spaced values
np.linspace(0,2,9)

Dica: brinque com as funções acima para entender como funcionam!

  • Em algumas, como np.ones(), np.random.random(), np.empty(), np.full() ou np.zeros(), você só precisa passar o shape do array que deseja criar. Em np.ones() e np.zeros(), você também pode especificar o tipo de dado. Em np.full(), é preciso indicar o valor constante a ser inserido.
  • Com np.linspace() e np.arange() você cria arrays de valores igualmente espaçados. A diferença é que o terceiro valor passado no código acima representa o passo em np.arange() ou o número de amostras em np.linspace(). No primeiro caso do exemplo, você quer um array com 9 valores entre 0 e 2. No segundo, você especifica que quer um array que comece em 10 e, de 5 em 5, gere valores para o array que está criando.

Lembre que o NumPy também permite criar uma matriz identidade com np.eye() e np.identity(). Uma matriz identidade é quadrada, com 1s na diagonal principal e 0s nos demais elementos. Ao multiplicar uma matriz por uma identidade, a matriz dada permanece inalterada.

Em outras palavras, ao multiplicar por uma matriz identidade, o produto resultante é a mesma matriz, pelas convenções padrão de multiplicação de matrizes.

Embora o foco aqui não seja demonstrar o funcionamento de matrizes identidade, vale dizer que elas são úteis quando você começa a fazer cálculos matriciais: simplificam equações e tornam as computações mais eficientes e robustas.

Como carregar arrays NumPy a partir de texto

Criar arrays com placeholders ou com dados de exemplo é ótimo para começar com o numpy. Mas, quando for fazer análise de dados, você vai precisar carregar dados de arquivos de texto.

Com o que vimos até agora, não dá para fazer muito. Use funções específicas para carregar dados dos seus arquivos, como loadtxt() ou genfromtxt().

Suponha que você tenha o arquivo de texto abaixo; copie e cole os valores comentados no código, salve como “data.txt” e use o código a seguir:

# This is your data in the text file
# Value1  Value2  Value3
# 0.2536  0.1008  0.3857
# 0.4839  0.4536  0.3561
# 0.1292  0.6875  0.5929
# 0.1781  0.3049  0.8928
# 0.6253  0.3486  0.8791

# Import your data
x, y, z = np.loadtxt('data.txt',
                    skiprows=1,
                    unpack=True)

No código acima, você usa o loadtxt() para carregar os dados. O primeiro argumento é o arquivo data.txt. Em seguida, há argumentos específicos: no primeiro comando, você pula a primeira linha e retorna as colunas como arrays separados com unpack=TRUE. Isso significa que os valores da coluna Value1 vão para x, e assim por diante.

Se você tiver dados separados por vírgula ou quiser especificar o tipo de dado, há também os argumentos delimiter e dtype que podem ser adicionados ao loadtxt().

Fácil e direto, certo?

Vamos ver seu segundo arquivo de dados:

# Your data in the text file
# Value1  Value2  Value3
# 0.4839  0.4536  0.3561
# 0.1292  0.6875  MISSING
# 0.1781  0.3049  0.8928
# MISSING 0.5801  0.2038
# 0.5993  0.4357  0.7410

my_array2 = np.genfromtxt('data2.txt',
                      skip_header=1,
                      filling_values=-999)

Aqui você recorre a genfromtxt() para carregar os dados. Neste caso, é preciso lidar com valores ausentes indicados pela string 'MISSING'.

Como genfromtxt() converte strings de caracteres em colunas numéricas para nan, você pode converter esses valores em outros especificando o argumento filling_values. Aqui, você escolhe definir -999 para os ausentes.

Se, por acaso, houver valores que não são convertidos para nan por genfromtxt(), use o argumento missing_values para especificar quais são exatamente os valores ausentes nos seus dados.

Mas não para por aí.

Dica: confira a página do numpy.genfromtxt para ver outros argumentos e importar seus dados com sucesso.

Você pode estar se perguntando qual a diferença entre essas duas funções.

Os exemplos sugerem isso implicitamente, mas, em geral, genfromtxt() dá um pouco mais de flexibilidade; é mais robusta que loadtxt().

De forma prática: loadtxt() só funciona quando cada linha do arquivo tem o mesmo número de valores, então, quando você precisa lidar com ausências com facilidade, costuma ser melhor usar genfromtxt().

E não é só por isso.

Um olhar rápido no número de argumentos de genfromtxt() mostra que dá para especificar muito mais coisas na importação, como o número máximo de linhas a ler ou a opção de remover automaticamente espaços em branco das variáveis.

Como salvar arrays NumPy

Depois de fazer o que precisa com seus arrays, você também pode salvá-los em um arquivo. Para salvar um array em um arquivo de texto, use a função savetxt():

import numpy as np
x = np.arange(0.0,5.0,1.0)
np.savetxt('test.out', x, delimiter=',')

Lembre que np.arange() cria um array de valores igualmente espaçados. O terceiro valor passado é o passo.

Claro, há outras formas de salvar arrays NumPy em arquivos de texto. Confira as funções na tabela abaixo se quiser gravar seus dados em binários ou arquivos compactados:

save() Salva um array em um arquivo binário no formato .npy do NumPy
savez() Salva vários arrays em um arquivo .npz não compactado
savez_compressed() Salva vários arrays em um arquivo .npz compactado

Para mais informações ou exemplos de uso dessas funções para salvar seus dados, veja esta página de referência do NumPy ou use as funções de ajuda do próprio NumPy!

Não tem certeza de quais são essas funções de ajuda?

Sem problemas! Você vai aprender mais sobre elas em uma das próximas seções!

Como inspecionar seus arrays NumPy

Além dos atributos citados acima — data, shape, dtype e strides — há outros que ajudam a conhecer melhor seus arrays. Os que podem ser úteis no começo são:

import numpy as np

# Create a numpy array with shape (2,4) and dtype int64
my_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print the number of dimensions of `my_array`
print("Number of dimensions of my_array:")
print(my_array.ndim)
print()

# Print the number of elements in `my_array`
print("Number of elements in my_array:")
print(my_array.size)
print()

# Print information about the memory layout of `my_array`
print("Information about the memory layout of my_array:")
print(my_array.flags)
print()

# Print the length of one array element in bytes
print("Length of one array element in bytes:")
print(my_array.itemsize)
print()

# Print the total consumed bytes by `my_array`'s elements
print("Total consumed bytes by my_array's elements:")
print(my_array.nbytes)
print()

Estes são quase todos os atributos que um array pode ter.

Não se preocupe se nem todos parecerem úteis agora. É normal, porque, como dito antes, você só começa a se preocupar com memória quando trabalha com conjuntos de dados grandes.

Além dos atributos, há outras formas de obter informações e até ajustar seu array levemente:

import numpy as np
my_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print the length of `my_array`
print(len(my_array))

# Change the data type of `my_array`
my_array.astype(float)

Agora que você criou seu array, seja com np.array() ou com funções de placeholders, ou carregando dados com loadtxt() ou genfromtxt(), é hora de olhar com mais atenção para o segundo elemento-chave que define o NumPy: a computação científica.

Como funciona o broadcasting no NumPy

Antes de avançar em computação científica, vale revisar o que é broadcasting: é um mecanismo que permite ao NumPy trabalhar com arrays de formatos (shapes) diferentes ao realizar operações aritméticas.

O infográfico abaixo mostra um exemplo do broadcasting do NumPy em ação: 

NumPy Broadcasting

Source

Na prática, você costuma ter um array maior e outro menor. Idealmente, você quer usar o array menor várias vezes para realizar uma operação (soma, multiplicação etc.) sobre o maior.

Para isso, você usa o mecanismo de broadcasting.

Mas existem algumas regras. E, antes de suspirar, já adianto: elas são simples e diretas!

  • Primeiro, para que o broadcasting funcione, as dimensões dos arrays precisam ser compatíveis. Duas dimensões são compatíveis quando são iguais. Considere o exemplo:
# Import the NumPy library and give it an alias of `np`
import numpy as np

# Initialize a 3x4 array of ones and assign it to the variable `x`
x = np.ones((3,4))

# Print the shape of the array `x`
print("Shape of x:", x.shape)

# Initialize a 3x4 array of random numbers between 0 and 1 and assign it to the variable `y`
y = np.random.random((3,4))

# Print the shape of the array `y`
print("Shape of y:", y.shape)

# Add the arrays `x` and `y` element-wise and print the resulting array
z = x + y
print("Result of x + y:\n", z)

# Print the shape of the resulting array
print("Shape of x + y:", z.shape)
  • Duas dimensões também são compatíveis quando uma delas é 1:
# Import the NumPy library and give it an alias of `np`
import numpy as np

# Initialize a 3x4 array of ones and assign it to the variable `x`
x = np.ones((3,4))

# Print the shape of the array `x`
print("Shape of x:", x.shape)

# Initialize a 3x4 array of random numbers between 0 and 1 and assign it to the variable `y`
y = np.random.random((3,4))

# Print the shape of the array `y`
print("Shape of y:", y.shape)

# Add the arrays `x` and `y` element-wise and print the resulting array
z = x + y
print("Result of x + y:\n", z)

# Print the shape of the resulting array
print("Shape of x + y:", z.shape)

Observe que, se as dimensões não forem compatíveis, você receberá um ValueError.

Dica: teste também qual é o tamanho do array resultante após os cálculos! Você verá que o tamanho é o máximo em cada dimensão entre os arrays de entrada.

Em outras palavras, o resultado de x-y tem shape (3,4): y tinha shape (4,) e x tinha shape (3,4). O tamanho máximo em cada dimensão de x e y é usado para formar o shape do novo array resultante.

  • Por fim, os arrays só podem ser broadcast juntos se forem compatíveis em todas as dimensões. Considere o exemplo:
# Import `numpy` as `np`
import numpy as np

# Initialize `x` and `y`
x = np.ones((3,4))
y = np.random.random((5,1,4))

# Add `x` and `y`
z = x + y

Mesmo que x e y pareçam ter dimensões diferentes, os dois podem ser somados.

Isso porque eles são compatíveis em todas as dimensões:

  • O array x tem dimensões 3 x 4,
  • O array y tem dimensões 5 x 1 x 4

Como vimos, dimensões também são compatíveis quando uma delas é 1, então esses dois arrays são bons candidatos a broadcasting!

Você vai notar que, na dimensão em que y tem tamanho 1 e o outro array tem tamanho maior que 1 (no caso, 3), o primeiro array se comporta como se fosse copiado ao longo dessa dimensão.

Note que o shape do array resultante novamente será o tamanho máximo em cada dimensão de x e y: a dimensão do resultado será (5,3,4)

Em resumo, para usar broadcasting, você vai depender bastante do shape e das dimensões dos arrays com que está trabalhando.

Mas e se as dimensões não forem compatíveis?

E se não forem iguais nem 1?

Você terá que ajustar isso manipulando seu array! Você verá como fazer isso em uma das próximas seções.

Como funcionam as operações matemáticas com arrays?

Você viu que o broadcasting é útil em operações aritméticas. Nesta seção, você vai conhecer algumas funções para fazer matemática com arrays.

Não surpreende que você possa usar +, -, *, / ou % para somar, subtrair, multiplicar, dividir ou calcular o resto entre dois (ou mais) arrays. Mas um dos motivos de o NumPy ser tão útil é que ele também tem funções para isso: os equivalentes são np.add(), np.subtract(), np.multiply(), np.divide() e np.remainder().

Você também pode fazer exponenciação e raiz quadrada com np.exp() e np.sqrt(), ou calcular seno e cosseno com np.sin() e np.cos(). Por fim, vale mencionar que dá para calcular o logaritmo natural com np.log() ou o produto escalar aplicando dot() ao seu array.

Experimente tudo no código abaixo.

Dica: confira antes os arrays que foram carregados para este exercício!

# Import `numpy` as `np`
import numpy as np
x = np.array([[1, 2, 3], [3, 4, 5]])
y = np.array([6,7,8])

# Add `x` and `y`
z = np.add(x,y)
print("Addition of x and y:\n", z)

# Subtract `x` and `y`
z = np.subtract(x,y)
print("Subtraction of y from x:\n", z)

# Multiply `x` and `y`
z = np.multiply(x,y)
print("Element-wise multiplication of x and y:\n", z)

Lembra como funciona o broadcasting? Confira as dimensões e os shapes de x e y no seu shell IPython. As regras de broadcasting foram respeitadas?

Mas tem mais.

Veja esta pequena lista de funções de agregação:

a.sum() Soma do array
a.min() Valor mínimo do array
b.max(axis=0) Valor máximo por linha de um array
b.cumsum(axis=1) Soma cumulativa dos elementos
a.mean() Média
b.median() Mediana
a.corrcoef() Coeficiente de correlação
np.std(b) Desvio padrão

Além de todas essas funções, existe mecanismo para comparar elementos de arrays. Por exemplo, para verificar se os elementos de dois arrays são iguais, use o operador ==. Para checar se são menores ou maiores, use < ou >.

Parece simples, né?

Você também pode comparar arrays inteiros entre si! Nesse caso, use np.array_equal(). Basta passar os dois arrays a serem comparados e pronto.

Além de comparar, você pode realizar operações lógicas nos arrays. Comece com np.logical_or(), np.logical_not() e np.logical_and(). Elas funcionam como os operadores lógicos OR, NOT e AND.

No exemplo mais simples, você usa OR para ver se os elementos são iguais a 1, ou se um dos dois é 1. Se ambos forem 0, retorna FALSE. Use AND para ver se o segundo elemento também é 1 e NOT para verificar se o segundo elemento difere de 1.

Teste no código abaixo:

# Import `numpy` as `np`
import numpy as np
# Initialize arrays
a = np.array([1, 1, 0, 0], dtype=bool)
b = np.array([1, 0, 1, 0], dtype=bool)

# `a` AND `b` 
np.logical_and(a, b)

# `a` OR `b`
np.logical_or(a, b)

# `a` NOT `b`
np.logical_not(a,b)

Como subselecionar, fatiar e indexar arrays

Além de operações matemáticas, às vezes você quer usar apenas uma parte do array original (ou do resultante) ou alguns elementos específicos para análises ou outras operações. Nesse caso, você vai precisar subselecionar, fatiar e/ou indexar seus arrays.

Essas operações são muito parecidas com as feitas em listas de Python. Se quiser conferir as semelhanças ou uma explicação mais detalhada, veja o tutorial de listas em Python da DataCamp.

Se você não tem noção de como essas operações funcionam, por ora basta saber duas coisas básicas:

  • Use colchetes [] como operador de índice; e
  • Geralmente você passa inteiros nesses colchetes, mas também pode usar dois-pontos : ou uma combinação de dois-pontos com inteiros para indicar os elementos/linhas/colunas que deseja selecionar.

Subsetting

Além desses dois pontos, a forma mais fácil de entender é vendo exemplos de subsetting:

import numpy as np

# Initialize 1D array
my_array = np.array([1,2,3,4])

# Print subsets
print(my_array[1])
import numpy as np

# Initialize 2D array
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print subsets
print(my_2d_array[1][2])
print(my_2d_array[1,2])
import numpy as np

# Initialize 3D array
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Print subset
print(my_3d_array[1,1,2])

Slicing

Algo um pouco mais avançado que subsetting é o slicing. Aqui, você considera não apenas valores pontuais, mas trabalha no nível de linhas e colunas. Basicamente, você seleciona “regiões” de dados em vez de “posições”.

Veja o que isso significa nos exemplos:

import numpy as np

# Initialize 1D array
my_array = np.array([1,2,3,4])

# Print subsets
print(my_array[0:2])
import numpy as np

# Initialize 2D array
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print subsets
print(my_2d_array[0:2,1])
import numpy as np

# Initialize 3D array
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Print subset
print(my_3d_array[1,...])

Em essência, vale o seguinte:

a[start:end] # itens do índice start até end (sem incluir o end!)
a[start:]    # itens do índice start até o fim do array
a[:end]      # itens do início até end (sem incluir o end!)

Nos códigos acima, cada array é inicializado separadamente e os subconjuntos são impressos em blocos separados. my_array, my_2d_array e my_3d_array são os arrays 1D, 2D e 3D, respectivamente, e os subconjuntos são impressos usando a notação de indexação.

No primeiro exemplo, usamos slicing para selecionar os itens nos índices 0 e 1 de my_array. No segundo, usamos slicing para selecionar os itens das linhas 0 e 1, coluna 1 de my_2d_array. No terceiro, usamos a notação ... para selecionar todos os elementos nas duas primeiras dimensões e o segundo elemento na terceira dimensão de my_3d_array.

Indexação

Por fim, temos a indexação. No NumPy, há a indexação booleana e a avançada (ou “fancy”).

(Caso esteja se perguntando, esse é jargão real do NumPy!)

Primeiro, a indexação booleana. Em vez de selecionar elementos, linhas ou colunas com base no índice numérico, você seleciona valores que atendem a uma condição.

Traduzir isso em código é simples:

import numpy as np
my_array = np.array([1,2,3,4])
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Try out a simple example
print(my_array[my_array<2])

# Specify a condition
bigger_than_3 = (my_3d_array >= 3)

# Use the condition to index our 3d array
print(my_3d_array[bigger_than_3])

Para especificar uma condição, você também pode usar os operadores lógicos | (OR) e & (AND). Se reescrever a condição acima dessa forma (ineficiente, mas didática :)), teria bigger_than_3 = (my_3d_array > 3) | (my_3d_array == 3).

Com os arrays carregados aqui, não há muitas possibilidades, mas com arrays que contêm, por exemplo, nomes ou capitais, as possibilidades são enormes!

Na indexação avançada (fancy), você passa uma lista ou um array de inteiros para especificar a ordem do subconjunto de linhas que quer selecionar do array original.

Pareceu abstrato?

Sem estresse, teste no bloco abaixo:

import numpy as np
my_array = np.array([1,2,3,4])
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Select elements at (1,0), (0,1), (1,2) and (0,0)
print(my_2d_array[[1, 0, 1, 0],[0, 1, 2, 0]])

# Select a subset of the rows and columns
print(my_2d_array[[1, 0, 1, 0]][:,[0,1,2,0]])

A segunda expressão pode não fazer sentido à primeira vista. É normal. Fica mais claro se você separar:

    • Se executar apenas my_2d_array[[1,0,1,0]], o resultado é:
array([[5, 6, 7, 8],
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [1, 2, 3, 4]])
    • O segundo trecho, [:,[0,1,2,0]], indica que você quer manter todas as linhas desse resultado, mas mudar a ordem das colunas: exibir as colunas 0, 1 e 2 como estão e repetir a coluna 0 como última coluna no lugar da coluna 3. Isso gera:
array([[5, 6, 7, 5],
   [1, 2, 3, 1],
   [5, 6, 7, 5],
   [1, 2, 3, 1]])

Indexação avançada não tem mais segredo para você!

Como pedir ajuda

Um pequeno intervalo: você sempre pode pedir mais informações sobre os módulos, funções ou classes com que está trabalhando — especialmente porque o NumPy pode ser desafiador no começo.

Pedir ajuda é bem simples.

Basta usar as funções de ajuda específicas do numpy para te guiar:

  • Use lookfor() para buscar por palavra-chave nas docstrings. É útil quando você está começando e a “teoria” pode escapar da memória. A desvantagem é ter que passar por muitos resultados se a consulta não for específica.
  • Use info() para explicações rápidas e exemplos de funções, classes ou módulos. Se você aprende fazendo, este é o caminho! A desvantagem é precisar saber em qual módulo certos atributos ou funções estão. Se isso não ficou claro, veja o exemplo abaixo.

As duas têm prós e contras, mas você verá como ambas são úteis. Teste no bloco abaixo!

import numpy as np

# Look up info on `mean` with `np.lookfor()` 
print(np.lookfor("mean"))
# Get info on data types with `np.info()`
np.info(np.ndarray.dtype)

Note que você precisa saber que dtype é um atributo de ndarray. E não esqueça de colocar np antes dos módulos, classes ou termos sobre os quais está pedindo informação, senão vai aparecer um erro como:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ndarray' is not defined

Agora você já sabe como pedir ajuda — e isso é ótimo. O próximo tópico deste tutorial de NumPy é a manipulação de arrays.

Não que você não consiga aprender isso sozinho — muito pelo contrário!

Mas algumas funções podem gerar dúvidas, como: qual a diferença entre redimensionar (resize) e reformular (reshape)?

E qual a diferença entre empilhar arrays horizontalmente e verticalmente?

A próxima seção responde a essas perguntas, e, sempre que pintar dúvida, use as funções de ajuda para acelerar seu aprendizado.

Como manipular arrays

Executar operações matemáticas nos seus arrays é importante, mas, para isso e para o broadcasting funcionarem bem, é fundamental saber manipular os arrays.

Abaixo estão algumas das manipulações mais comuns.

Como transpor seus arrays

Transpor arrays significa permutar suas dimensões. Em outras palavras, você inverte o shape do array. Veja um exemplo para mostrar o efeito da transposição:

import numpy as np
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print `my_2d_array`
print(my_2d_array)

# Transpose `my_2d_array`
print(np.transpose(my_2d_array))

# Or use `T` to transpose `my_2d_array`
print(my_2d_array.T)

Dica: se a comparação visual entre o array e sua versão transposta não estiver clara, inspecione o shape dos dois para entender como as dimensões foram permutadas.

Existem duas formas de transpor. Ambas fazem a mesma coisa; a diferença é pequena. T é mais uma conveniência, e você tem mais flexibilidade com np.transpose(). Por isso, recomenda-se usar np.transpose() quando quiser passar mais argumentos.

Tudo certo ao transpor arrays com mais de uma dimensão, mas o que acontece com um array 1D? Haverá algum efeito?

Teste você mesmo no bloco abaixo. Seu array 1D já foi carregado:

import numpy as np
my_array = np.array([1,2,3,4])

# Print `my_2d_array
print(my_array)

# Transpose `my_2d_array
print(np.transpose(my_array))

# Or use `T` to transpose `my_2d_array
print(my_array.T)

Isso mesmo! Não há efeito ao transpor um array 1D!

Reshape versus resize

Você viu na seção de broadcasting que as dimensões dos arrays precisam ser compatíveis para operações aritméticas. Mas o que fazer quando não são?

Aqui vai a resposta!

Se os arrays não têm as mesmas dimensões, você pode redimensionar (resize) seu array. Isso retorna um novo array com o shape passado para np.resize(). Se você passar seu array original com as novas dimensões e se o novo array for maior que o original, ele será preenchido com cópias do array original repetidas quantas vezes forem necessárias.

Por outro lado, se você aplicar np.resize() diretamente e passar apenas o novo shape, o novo array será preenchido com zeros.

Vamos testar com um exemplo:

import numpy as np
x = np.ones((3,4))

# Print the shape of `x`
print(x.shape)

# Resize `x` to ((6,4))
np.resize(x, (6,4))

# Try out this as well
x.resize((6,4))

# Print out `x`
print(x)

Além de redimensionar, você também pode fazer reshape no array. Isso significa dar um novo formato sem alterar os dados. A chave é garantir que o tamanho total do novo array permaneça o mesmo. Se tomarmos o array x acima, com tamanho 3 x 4 (12), o novo array também precisa ter tamanho 12.

Psst… Se quiser calcular o tamanho com código, use o atributo size: x.size ou x.reshape((2,6)).size:

import numpy as np

# Initialize array with shape (3,4) containing all ones
x = np.ones((3,4))

# Print the shape of `x`
print("Shape of x:", x.shape)

# Resize `x` to ((6,4))
np.resize(x, (6,4))

# Try out this as well
x.resize((6,4))

# Print out `x` before and after resizing
print("Array before transposing:\n", x)
print("Shape of array before transposing:", x.shape)

# Transpose `x`
x = x.T

# Print out `x` after transposing
print("Array after transposing:\n", x)
print("Shape of array after transposing:", x.shape)

Saída: 

Shape of x: (3, 4)
Array before transposing:
 [[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
Shape of array before transposing: (6, 4)
Array after transposing:
 [[1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]]
Shape of array after transposing: (4, 6)

Se nada der certo, você também pode anexar (append) um array ao original, ou inserir ou deletar elementos para ajustar as dimensões e torná-las compatíveis com o outro array das suas contas.

Outra operação útil ao alterar o shape é ravel(). Essa função “achata” arrays. Ou seja, se você tiver arrays 2D, 3D ou nD, pode usar ravel() para transformá-los em um array 1D.

Bem prático, né?

Como anexar arrays

Ao anexar arrays ao array original, eles são “colados” ao final. Se você quiser inserir em outra posição, considere usar insert. Vá para a próxima seção para saber mais.

Fazer append é bem simples com NumPy; basta usar np.append().

Veja como funciona no código abaixo. Lembre que você pode conferir os arrays carregados digitando, por exemplo, my_array no shell IPython e pressionando ENTER.

import numpy as np

my_array = np.array([1,2,3,4])

# Print `my_array` before appending
print("my_array before appending:", my_array)

# Append a 1D array to `my_array`
new_array = np.append(my_array, [7, 8, 9, 10])

# Print `new_array`
print("new_array:", new_array)

# Print `my_array` after appending
print("my_array after appending:", my_array)

Saída:

my_array before appending: [1 2 3 4]
new_array: [ 1  2  3  4  7  8  9 10]
my_array after appending: [1 2 3 4]

Note que my_array permanece inalterado após o append porque np.append() retorna um novo array em vez de modificar o original.

Fazendo append em my_2d_array:

import numpy as np

my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print `my_2d_array` before appending
print("my_2d_array before appending:\n", my_2d_array)

# Append an extra column to `my_2d_array`
new_2d_array = np.append(my_2d_array, [[7], [8]], axis=1)

# Print `new_2d_array`
print("new_2d_array:\n", new_2d_array)

# Print `my_2d_array` after appending
print("my_2d_array after appending:\n", my_2d_array)

Saída: 

my_2d_array before appending:
 [[1 2 3 4]
  [5 6 7 8]]
new_2d_array:
 [[1 2 3 4 7]
  [5 6 7 8 8]]
my_2d_array after appending:
 [[1 2 3 4]
  [5 6 7 8]]


Note que, ao anexar uma coluna extra a my_2d_array, o eixo é especificado. Lembre que em arrays 2D o axis 1 indica colunas e o axis 0 indica linhas.

Como inserir e deletar elementos

Além de anexar, você pode inserir e deletar elementos. Como você deve imaginar, as funções para isso são np.insert() e np.delete():

import numpy as np
my_array = np.array([1,2,3,4])
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Insert `5` at index 1
np.insert(my_array, 1, 5)

# Delete the value at index 1
np.delete(my_array,[1])

Como unir e dividir arrays

Você também pode “juntar” ou unir arrays. Há várias funções para isso e a maioria está listada abaixo.

Teste-as, e também confira o shape dos arrays no shell IPython. Os arrays carregados são x, my_array, my_resized_array e my_2d_array.

import numpy as np 
x = np.ones((4,))
my_array = np.array([1,2,3,4])
my_resized_array=np.resize(my_array,(2,4))
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Concatentate `my_array` and `x`
print(np.concatenate((my_array,x)))

# Stack arrays row-wise
print(np.vstack((my_array, my_2d_array)))

# Stack arrays row-wise
print(np.r_[my_resized_array, my_2d_array])

# Stack arrays horizontally
print(np.hstack((my_resized_array, my_2d_array)))

# Stack arrays column-wise
print(np.column_stack((my_resized_array, my_2d_array)))

# Stack arrays column-wise
print(np.c_[my_resized_array, my_2d_array])

Você vai notar algumas coisas ao usar essas funções:

  • O número de dimensões precisa ser o mesmo para concatenar dois arrays com np.concatenate(). Assim, se quiser concatenar algo com my_array, que é 1D, o outro também deve ser 1D.
  • Com np.vstack(), você combina my_array com my_2d_array sem esforço. Basta garantir que, como está empilhando por linhas, o número de colunas seja o mesmo em ambos. Assim, você pode adicionar um array com shape (2,4) ou (3,4) a my_2d_array, desde que as colunas combinem. Em outras palavras, os arrays devem ter o mesmo shape em todos os eixos, exceto o primeiro. O mesmo vale para np.r[].
  • Para np.hstack(), as dimensões precisam ser as mesmas e o número de linhas deve coincidir. Isso significa que você pode empilhar arrays como (2,3) ou (2,4) com my_2d_array, que tem shape (2,4). Tudo é possível desde que o número de linhas bata. Essa função ainda é suportada pelo NumPy, mas prefira np.concatenate() ou np.stack().
  • Com np.column_stack(), os arrays de entrada devem ter a mesma primeira dimensão. Neste caso, os shapes são iguais, mas se my_resized_array fosse (2,1) ou (2,), ainda assim seriam empilhados.
  • np.c_[] é outra forma de concatenar. Aqui também, a primeira dimensão de ambos deve coincidir.

Depois de unir arrays, você pode querer dividi-los. Assim como você empilha horizontalmente, também pode dividir horizontal ou verticalmente. Use np.hsplit() e np.vsplit(), respectivamente:

import numpy as np
my_array = np.array([1,2,3,4])
my_resized_array=np.resize(my_array,(2,4))
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)
my_stacked_array = np.hstack((my_resized_array, my_2d_array))

# Split `my_stacked_array` horizontally at the 2nd index
print(np.hsplit(my_stacked_array, 2))

# Split `my_stacked_array` vertically at the 2nd index
print(np.vsplit(my_stacked_array, 2))

Ao usar essas funções de split, tenha em mente o shape do seu array. No caso acima: my_stacked_array tem shape (2,8). Ao escolher o índice da divisão, considere o shape.

Como visualizar arrays NumPy

Por fim, algo que certamente será útil é saber como plotar seus arrays. Isso ajuda na exploração dos dados e também em etapas posteriores do fluxo de trabalho, quando você quer visualizar seus arrays.

Com np.histogram()

Ao contrário do que o nome sugere, a função np.histogram() não desenha o histograma — ela calcula as ocorrências do array que caem em cada faixa (bin); isso determina a área de cada barra do histograma.

Você passa primeiro os dados de entrada (seu array). Ele será achatado (flattened) quando o histograma for calculado.

# Import `numpy` as `np`
import numpy as np

# Initialize your array
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Pass the array to `np.histogram()`
print(np.histogram(my_3d_array))

# Specify the number of bins
print(np.histogram(my_3d_array, bins=range(0,13)))

Como resultado, o histograma é calculado: o primeiro array lista as frequências de todos os elementos e o segundo lista as faixas (bins) que seriam usadas se você não especificar nada.

Se você especificar o número de bins, o resultado muda: os floats somem e você verá apenas inteiros para os bins.

Há outros argumentos que influenciam o histograma. Você encontra todos aqui.

Mas qual o ponto de calcular o histograma sem visualizá-lo?

A visualização é simples com Matplotlib, e você nem precisa do np.histogram(): o plt.hist() faz o cálculo ao receber os dados (achatados) e os bins:

# Import numpy and matplotlib
import numpy as np
import matplotlib.pyplot as plt

# Construct the histogram with a flattened 3d array and a range of bins
plt.hist(my_3d_array.ravel(), bins=range(0,13))

# Add a title to the plot
plt.title('Frequency of My 3D Array Elements')

# Show the plot
plt.show()

O código acima gera o seguinte histograma (básico):

Numpy Array Histogram

Usando np.meshgrid()

Outra forma de (indiretamente) visualizar seu array é com np.meshgrid(). O desafio com arrays é que você precisa de arrays 2D de coordenadas x e y. Com essa função, você cria uma grade retangular a partir de um array de valores x e outro de valores y: np.meshgrid() recebe dois arrays 1D e produz duas matrizes 2D correspondentes a todos os pares (x, y) dos dois arrays. Depois, você pode usar essas matrizes para vários tipos de gráfico.

np.meshgrid() é particularmente útil para avaliar funções em uma grade, como mostra o código abaixo:

# Import NumPy and Matplotlib
import numpy as np
import matplotlib.pyplot as plt

# Create an array
points = np.arange(-5, 5, 0.01)

# Make a meshgrid
xs, ys = np.meshgrid(points, points)
z = np.sqrt(xs ** 2 + ys ** 2)

# Display the image on the axes
plt.imshow(z, cmap=plt.cm.gray)

# Draw a color bar
plt.colorbar()

# Show the plot
plt.show()

O código acima gera o seguinte resultado:

Numpy Meshgrid

Além da análise de dados com NumPy

Parabéns, você chegou ao fim do tutorial de NumPy!

Muita coisa foi vista, então garanta que vai reter esse conhecimento. Não esqueça de baixar o cheat sheet de NumPy da DataCamp para te acompanhar nisso!

Depois de tanta teoria, é hora de praticar os conceitos e técnicas aprendidos aqui. Uma forma é voltar ao tutorial de scikit-learn e começar a experimentar ainda mais com os arrays de dados usados para construir modelos de machine learning.

Se isso não é muito a sua praia, veja se você já baixou o Anaconda. Depois, comece com arrays NumPy no Jupyter com este guia definitivo do Jupyter Notebook. Também confira este Jupyter Notebook, que guia você pela análise de dados em Python com NumPy e outras bibliotecas no ambiente interativo do Jupyter.

Por fim, considere explorar os cursos da DataCamp sobre manipulação e visualização de dados. Nossos cursos mais recentes em colaboração com a Continuum Analytics vão te interessar! Dê uma olhada em Manipulating DataFrames with Pandas ou Pandas Foundations.

Tópicos
Python
Ciência de dados
Data Analysis

Saiba mais sobre Python

Curso

Introdução ao NumPy

4 h
61.9K
Domine suas habilidades em NumPy aprendendo a criar, classificar, filtrar e atualizar matrizes usando o censo de árvores de NYC.
Ver detalhesRight Arrow
Iniciar Curso
Ver maisRight Arrow
Relacionado

blog

Top 20 perguntas sobre NumPy em entrevistas: do básico ao avançado

Prepare-se para sua próxima entrevista em ciência de dados com perguntas essenciais sobre NumPy, do básico ao avançado. Perfeito para afiar suas habilidades e ganhar confiança!
Tim Lu's photo

Tim Lu

9 min

Tutorial

Matrizes Python

Matrizes Python com exemplos de código. Aprenda hoje mesmo a criar e imprimir matrizes usando o Python NumPy!
DataCamp Team's photo

DataCamp Team

3 min

Tutorial

Funções em Python: como chamar e escrever funções

Descubra como escrever funções em Python reutilizáveis e eficientes. Domine parâmetros, instruções de retorno e temas avançados como funções lambda. Organize melhor seu código com main() e outras boas práticas.
Karlijn Willems's photo

Karlijn Willems

14 min

Tutorial

Tutorial do Python pandas: O guia definitivo para iniciantes

Você está pronto para começar sua jornada com os pandas? Aqui está um guia passo a passo sobre como você pode começar.
Vidhi Chugh's photo

Vidhi Chugh

15 min

Tutorial

Tutorial sobre loops for em Python

Aprenda a usar loops “for” em Python pra iterar uma sequência ou as linhas e colunas de um DataFrame pandas.
Aditya Sharma's photo

Aditya Sharma

5 min

Tutorial

Tutorial sobre loops em Python

Um tutorial introdutório completo sobre loops em Python. Aprenda e pratique loops while e for, loops aninhados, as palavras-chave break e continue, a função range e muito mais!
Satyabrata Pal's photo

Satyabrata Pal

15 min

Ver MaisVer Mais