Numpy: trabalhando computação científica com Python

Numpy: trabalhando computação científica com Python
Marcus Almeida
Marcus Almeida

Compartilhe

Introdução

Em aplicações científicas, de engenharia e principalmente de ciência de dados existe a necessidade de realizar cálculos numéricos especializados.

Quando você faz a soma de todos os valores de uma coluna em um software de planilhas ou mesmo operações matemáticas entre as diferentes colunas, existe um código implementado para tornar essas operações possíveis. Da mesma forma, se você já usou uma função de uma biblioteca Python que faz regressão linear ou um algoritmo de machine learning qualquer, saiba que esses códigos são a tradução de um conjunto de equações matemáticas para código. Essas implementações precisam ser eficientes e fáceis de compreender. Quanto mais próximo o código escrito estiver da escrita da matemática, melhor.

Nesse contexto, em Python, surge a NumPy. Essa é uma biblioteca poderosa e amplamente utilizada que revolucionou o segmento de computação científica. Isso, principalmente, pelo caráter aberto da linguagem Python. Com a NumPy, é possível realizar operações matemáticas complexas com objetos do tipo array de forma eficiente e otimizada. Mas o que exatamente é e como funciona a Numpy?

Banner promocional da Alura, com um design futurista em tons de verde, apresentando o texto

O que é o NumPy?

Logotipo da biblioteca Numpy.

NumPy, uma abreviação de Numerical Python, é uma biblioteca de código aberto do Python para computação científica, campo de estudo que utiliza recursos computacionais para entender e resolver problemas. Essa biblioteca permite trabalhar com a manipulação de objetos array multidimensionais, além de seus objetos derivados, como matrizes, sequências, e outros. Além disso, também possui uma grande variedade de operações rápidas com os arrays, incluindo operações matemáticas e lógicas, manipulações de formato, ordenação e seleção, ferramentas de estatística e cálculo, e muito mais.

A biblioteca NumPy foi lançada em 2005, pelo cientista de dados Travis Oliphant, com a proposta de ser uma ferramenta rápida, eficiente e fácil de usar, permitindo assim a realização de cálculos numéricos e matemáticos em larga escala, por meio da funcionalidade chamada vetorização. Por isso, tornou-se uma das bases fundamentais para análise de dados, aprendizado de máquina (machine learning) e computação científica em geral, estando presente também na construção de várias bibliotecas de ciência de dados, incluindo: Pandas, Matplotlib, Scikit-learn, SciPy, e muitas outras.

Uma curiosidade sobre essa biblioteca é que ela também esteve presente nos trabalhos de descobertas científicas recentes importantes, como a detecção da primeira imagem de um buraco negro, e também a detecção de ondas gravitacionais.

Mas como exatamente funciona o NumPy?

Estruturas básicas do NumPy

A Numpy funciona por meio de estruturas chamadas arrays, que são estruturas de dados homogêneas, isto é, onde os elementos possuem o mesmo tipo. Essas estruturas podem ter vários formatos e dimensões, que variam com a necessidade de cada tipo de projeto. De maneira geral, para vários tipos de aplicações, trabalhamos até a terceira dimensão, mas existem casos onde podemos necessitar de mais.

O conceito de dimensão pode ser aplicado no Python a partir do conceito das listas aninhadas (nested lists). Para isso, vamos usar as seguintes estruturas:

Imagem com textos em preto e fundo branco. Na imagem, temos uma estrutura que mostra três colunas contendo diferentes representações para o mesmo objeto. Na primeira linha, o texto “Escalar (0-d”), seguido de um termo a0 entre colchetes, seguido de um termo 42, entre colchetes. Na segunda linha, o texto “Array unidimensional (1-d)”, seguido de uma sequência com os termos a0 a1 a2 entre colchetes, seguido de uma sequência 4 5 22 entre colchetes. Na terceira linha, o texto “Array bidimensional (2-d)”, seguido de uma matriz 3 x 3, com os termos a00 a01 a02 na primeira linha, a10 a11 a12 na segunda linha, a20 a21 a22 na terceira linha. E na próxima coluna, uma matriz 3x3, com os termos 3 2 7 na primeira linha, 4 9 1 na segunda linha, e 5 6 8 na terceira linha.

Escalar: um elemento único, adimensional. Pode ser um inteiro, float, hexadecimal, caractere, e vários outros tipos de dado.

No Python, após importar a biblioteca, nós definimos um escalar como:

import numpy as np
np.array(42)

Array unidimensional: uma lista de escalares onde podemos identificar cada um deles pela sua posição, ou índice, na lista. É preciso ressaltar que todos os elementos escalares aqui possuem o mesmo tipo, e que se não for especificado durante a definição do array, o Numpy trabalhará uma rotina para determinar o tipo que garanta a característica homogênea.

np.array([4, 5, 22, 20])

Array bidimensional: uma lista de arrays unidimensionais, com o formato de uma matriz (tabela), onde precisamos especificar uma posição de linha e uma posição de coluna para localizar um elemento escalar.

np.array([[3, 2, 7],
          [4, 9, 1],
          [5, 6, 8]])
Imagem colorida em fundo branco. Na imagem, três representações para as estruturas de escalar, array unidimensional e array bidimensional. Cada estrutura é mostrada como a união de figuras geométricas de cubos verdes empilhados, contendo textos em branco. A primeira estrutura, da esquerda para direita, é um cubo com texto 42, e a legenda “Escalar (array 0d)”. A segunda é a união de três cubos na horizontal, respectivamente com os textos 4, 5 e 22. Há uma seta abaixo apontando para direta, com o texto “axis 0“ e legenda “A. unidimensional (1-d)”. A terceira imagem é a união de 9 cubos, no formato 3x3, com os textos, de cima para baixo, 3, 2, 7; 4, 9, 1; 5, 6, 8. Há uma seta horizontal abaixo, apontando para a direita, com a legenda “axis 1”, e outra seta à esquerda do cubo, indo de cima para baixo, com a legenda “axis 0”. Abaixo do cubo, uma legenda “A. bidimensional (2-d)”.

Array tridimensional: uma lista de arrays bidimensionais. Um exemplo de aplicação de array tridimensional é a matriz de imagem RGB, possível de se observar no funcionamento de uma televisão. Nesse caso, nós temos uma estrutura bidimensional (o formato da tela), em que podemos localizar uma unidade de pixel com uma referência na vertical, e outra na horizontal. Para cada unidade de pixel, também temos uma representação de um array de 3 elementos, que é a junção de três leds de cores vermelha, verde e azul. Então, a nível fundamental, podemos interpretar uma imagem como:

Três imagens em sequência com um fundo branco. A primeira imagem é a foto de um gato, representando uma imagem colorida RGB genérica. A segunda imagem representa a decomposição da primeira em três canais RGB. A terceira imagem detalha a decomposição RGB em três tabelas de dados, uma para cada canal.

Array multidimensional (n-dimensional): as operações de criação de arrays no Numpy não estão limitadas apenas às dimensões anteriores: é possível construir estruturas de quantias maiores, tanto quanto mais forem necessárias, desde que o critério dos objetos de mesmo nível possuam o mesmo formato. Uma maneira de ilustrar esses novos níveis é através do seguinte esquema:

Figura com fundo branco mostrando três arrays, cada um com um número de dimensões diferentes. O primeiro array, da esquerda para direta, possui três dimensões. O segundo array possui 4 dimensões, sendo exemplificado como a composição de dois arrays tridimensionais, um sobre o outro; temos uma nova dimensão que pode ser formada por "n" arrays tridimensionais em sequência. O terceiro array possui 5 dimensões, sendo mostrado como a combinação de 6 arrays tridimensionais, nesse caso temos duas dimensões, cada uma formada por uma sequência de arrays tridimensionais.

Nesse esquema, quando chegamos à quarta dimensão e além, é mais difícil visualizar a matriz como um objeto geométrico. Em vez disso, podemos interpretar uma matriz de ordem superior como um objeto matemático que contém informações sobre outros objetos matemáticos.

Por exemplo, uma matriz de quarta ordem pode ser vista como uma matriz de matrizes de matrizes, ou seja, cada elemento da matriz é uma matriz de matrizes. Podemos interpretar essa matriz como um objeto matemático que contém informações sobre vários objetos matemáticos mais simples.

Broadcasting

O broadcasting é uma funcionalidade do Numpy que permite trabalhar com operações em arrays de formas e tamanhos diferentes, sem que seja necessário criar cópias dos dados. Por esse motivo, é uma técnica que economiza tempo e memória. Em muitos casos, o broadcasting pode reduzir o número de linhas de código necessárias para realizar uma determinada operação.

Por exemplo, na operação abaixo:

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])

a + b

No exemplo acima, trabalhamos com a soma de dois arrays com dimensões diferentes, no caso, um array unidimensional e uma matriz. No entanto, o Numpy consegue analisar as dimensões, através de regras pré-estabelecidas, e executar a operação, retornando:

array([[11, 22],
       [13, 24]])

NumPy na computação científica

Por ser uma biblioteca do Python, uma grande vantagem de trabalhar com o NumPy é a possibilidade de integração com outras bibliotecas do grande ecossistema do Python. Isso abre espaço para trabalhar com soluções end-to-end, que atendem desde o início, com coletas de dados, processamento, até a entrega do produto final, por exemplo, uma dashboard ou sistema com uma análise detalhada de modelos de aprendizado de máquina.

Essas características, somadas ao fato da biblioteca ser de código aberto e livre, tornam o NumPy um grande concorrente de outras soluções presentes no mercado e meio acadêmico, tais como o MATLAB, Octave, Scilab, entre outros.

Instalação do NumPy

Assim como em algumas outras bibliotecas importantes na Ciência de Dados, como o Pandas, a instalação sugerida como sendo a mais simples na documentação do NumPy é através da instalação do Anaconda.

Logotipo do Anaconda.

O Anaconda é um ambiente de desenvolvimento voltado para Ciência de Dados com Python e R, que trás instaladas várias bibliotecas e softwares de uso popular no ramo. Dentre as bibliotecas instaladas, temos também o NumPy. Você pode aprender como instalar o Anaconda no Windows através da documentação oficial do Anaconda.

Uma outra maneira de instalar a biblioteca NumPy é utilizando o gerenciador de pacotes do Python, o PIP.

Desde que você tenha feito o download do Python a partir do site oficial, podemos utilizar o seguinte procedimento:

Atenção: Caso você tenha mais de um disco rígido na sua máquina, é preciso garantir que a instalação está sendo feita no mesmo disco onde o Python foi instalado.

1) Para começar, devemos abrir o Prompt de Comando do seu sistema operacional. No Windows, pressione as teclas de atalho Windows + R, digite “Prompt de Comando”, e clique na opção “Executar como administrador”:

Captura de tela em recorte. Na imagem, é mostrado o buscador do Windows com o texto “Prompt de Comando” no campo de busca no canto superior. Na lateral direita, é mostrado um quadro com o aplicativo do Prompt de Comando, onde aparecem as opções “Abrir”, “Executar como administrador”, “Abrir local do arquivo”, “Fixar em iniciar” e “Fixar na barra de tarefas”. A segunda opção, “Executar como administrador”, é destacada com um quadro retangular vermelho.

2) O Prompt de Comando será aberto e surgirá a tela preta do terminal. Nesse momento, podemos verificar a versão do Python instalada na máquina com o comando python --version e garantir que podemos continuar:

python --version
Python 3.9.7

3) Caso você ainda não tenha o PIP instalado na máquina, pode instalá-lo utilizando um módulo nativo do Python para isso, com o comando:

python -m ensurepip --upgrade

4) E, agora que já temos o PIP instalado na máquina, podemos utilizá-lo para instalar o NumPy, com o comando:

pip install numpy

5) Pronto, agora nós já temos o NumPy instalado na máquina.

Indo além

Se você deseja mergulhar ainda mais nos conteúdos de Pandas e Ciência de Dados, aqui na Alura nós temos a Formação Python para Data Science. A formação aborda as principais ferramentas utilizadas em Ciência de Dados com Python, tais como Pandas, Numpy, Matplotlib, Seaborn, e muito mais. Nela, construímos vários projetos práticos para compor o seu portfólio como profissional de dados.

E se você já deu seus primeiros passos nessa ferramenta, te convidamos a participar dos Challenges de Data Science. Neles, você pode trabalhar na construção de um portfólio de projetos, desenvolvendo habilidades em limpeza, tratamento e visualização de dados, e também competências em Machine Learning.

Links úteis:


Créditos

Conteúdo:

Produção técnica:

Produção didática:

Designer gráfico:

Marcus Almeida
Marcus Almeida

Bacharelando em Engenharia Elétrica pelo Instituto Federal do Maranhão. Atuou como parte do Scuba Team da Escola de Dados na Alura, trabalhando com conteúdos voltados a Data Science, Machine Learning, Python e SQL. Adora conversar tecnologia, universo geek, games e também aprender coisas novas.

Veja outros artigos sobre Data Science