Enviar um café pro programador

Mostrando postagens com marcador Biblioteca. Mostrar todas as postagens
Mostrando postagens com marcador Biblioteca. Mostrar todas as postagens

A biblioteca NumPy – Arrays, Vetores, Arrays Multidimensionais e Matrizes

Neste tutorial, vamos conhecer um pouco mais sobre a biblioteca Numpy, a library mais fundamental do mundo da programação científica, computação numérica e até mesmo da análise de dados.

Vamos aprender o que são e para que servem os arrays, vetores, matrizes e arrays multidimensionais.


Sobre a as origens da biblioteca NumPy

Um dos maiores grupos de praticantes de programação, são as pessoas do meio científico.

Então, sempre que surge uma nova linguagem, uma nova ferramenta, um novo programa ou sistemas, não tenha dúvidas: vários físicos, matemáticos, químicos, engenheiros etc, vão dar uma olhada para ver se aquilo pode ser usado no mundo das ciências.

E não foi diferente com o Python. Aquela linguagem bonita, simples e bem direta, encantou os cientistas.

Em 1995, a comunidade já começou a lançar pacotes voltadas para cálculos numéricos, como o Numarray e o Numeric. Depois, esses dois pacotes e diversas outras funções foram agrupadas e em 2006 foi lançada a primeira versão da NumPy library.

Desde então, se tornou a biblioteca mais usada pela comunidade científica do mundo inteiro, para performar operações em arrays com uma eficiência e versatilidade incrível.

Se seus dados e informações podem ser colocados em um array, então você pode fazer tudo e mais um pouco com eles, usando o NumPy.

O core da biblioteca foi escrito em linguagem C, conhecida por ser extremamente robusta, rápida e poderosa.


Arrays e Vetores em Python

Antes de entrar em mais detalhes sobre a NumPy, vamos relembrar o que são arrays, vetores, matrizes...

O que é um Array

Inicialmente, no estudo da programação, vamos definindo variáveis. Por exemplo, uma variável para armazenar sua nota de Cálculo I. Depois, usamos outra variável para armazenar sua nota de Física I.

Veja que, com esses dois dados já podemos calcular a sua média. Mas, provavelmente você tem mais matérias. Então vamos definir mais variáveis para armazenar suas notas de Introdução a Química, Física Experimental, Programação...veja, já temos 5 variáveis, só para suas notas.

Agora imagina que você precise trabalhar com as notas de todas as pessoas da sua sala, uns 40 alunos. Iria precisar de 200 variáveis. E aí? Vai definir, inicializar e trabalhar com cada uma dessas variáveis, individualmente? Sem chance.

E aí que entram os arrays. Array é um tipo de estrutura de dados, é como se fosse um novo tipo de 'variável', que consegue armazenar, de maneira ordenada, diversas variáveis, do mesmo tipo, de uma vez só.

Imagine uma variável como um espaço na memória do seu computador. Um quadradinho. Um array, é um conjunto 'grudado' desses quadradinhos:

Vetor em Python
O array é essa fila de bloquinhos, onde cada bloco pode armazenar uma variável. Cada bloco é definido por um índice. O primeiro é sempre 0.
Na imagem acima, temos um array de 6 elementos: o elemento 0, o elemento 1, ...e o elemento 5.

Ou seja, em vez de criar 200 variáveis para armazenar notas (variável do tipo float - números decimais), apenas use um array do tipo float de tamanho 200.

Veja bem, uma variável comum armazena apenas um tipo de informação (um número inteiro, ou um decimal, ou uma string, ou um valor lógico etc). Sempre uma coisa apenas.

Então, um array é uma variável especial que pode armazenar várias informações de uma vez só.


O que é uma matriz ou array multidimensional

No exemplo anterior, das 5 notas dos 40 alunos, teríamos um array de 200 elementos. Ou seja, 1 linha e 200 colunas. É um array de apenas uma dimensão.

Agora imagina que o coordenador do seu curso tenha 4 turmas iguais a sua. Ele ia precisar de 200 variáveis para armazenar as notas da primeira turma, mais 200 para a da segunda turma, mais 200 para a terceira e para a quarta.

Em vez de um array com uma dimensão, de uma linha, seria interessante ele ter um array com 4 linhas. Assim, cada linha representaria uma turma.

Temos então um array multidimensional, do tipo 4 x 200, ou seja, 4 linhas e 200 colunas.

Matrizes em NumPy

Na imagem acima, temos um array multidimensional do tipo 3x3, 3 linhas e 3 colunas.
É um array 2D (duas dimensões), onde cada linha é um array 1D (de uma dimensão).

Isso te lembra algo, do ensino médio ou de álgebra linear? Sim, amigos. É uma matriz.


O que é um vetor

Ou seja, arrays podem armazenar diversas informações, e em vários formatos (shapes) e dimensões. Eles possuem no mínimo uma linha e uma coluna (array com um elemento só).

Mas podem ter diversas linhas e diversas colunas, como em uma matriz. Mas veja, uma matriz é um elemento bidimensional. Podemos ter arrays com mais dimensões, inclusive.
Array de Matrizes em NumPy

No exemplo acima, temos 3 matrizes. Cada matriz é do tipo 4x4, e cada elemento dessa matriz é uma lista. É um array multidimensional, de 3 dimensões, do tipo 3x4x4

Já um vetor (vector) é nada mais que um array, mas sempre de uma dimensão apenas. Que se assemelham muito com as listas do Python, que já estudamos vastamente aqui em nosso curso.


Diferença entre lista e vetor

As listas são estrutura de dados heterogêneas, ou seja, você pode criar uma lista com um número inteiro, seguido de um caractere, depois um float, um texto etc.
Você pode agrupar todo tipo de dado que quiser, em uma lista do Python.

Já os arrays, que estudaremos em Computação Científica e Data Science, devem sempre armazenar elementos do mesmo tipo. Ou seja, arrays são homogêneos.

Outra característica, é que os arrays tem tamanhos fixos, definidos no momento de sua criação. Se precisarmos mudar, vamos ter que criar outro array.

Já as listas são dinâmicas, você pode aumentar e reduzir seu tamanho sempre que desejar. São mais flexíveis, porém isso tem seu preço computacional, são mais lentas.

Por conta dessas características mais específicas, os arrays são bem mais rápidos e eficientes, consumindo menos memória e necessitando menos capacidade computacional. Portanto, não é de se estranhar terem sido escolhidos como a base da computação numérica no NumPy


O que é possível fazer com o NumPy

Agora que já entramos em detalhes mais específicos sobre arrays, vetores e matrizes, vamos ver o que é possível fazer com arrays.

Basicamente, vamos aprender a manipular e processar arrays.

Sabe nossa matriz, com as notas? Podemos descobrir a média de cada aluno, de cada turma. Ou podemos descobrir quais foram as médias dele em cada matéria.

Com base nisso, podemos dizer quem tirou acima de 7.0 e passou direto, quem tirou entre 4.0 e 7.0 e vai pra recuperação, e os que reprovaram direto.

E qual turma foi a melhor? Ora, manipulando os arrays para calcular a média de cada sala (lembra que cada linha representa uma turma? Ué, tira a média dos dados de cada linha da matriz).

Podemos 'quebrar' o array multidimensional em outros menores, somente com as notas de cada matéria ou de cada turma.

Podemos também adicionar mais uma linha nesse array, com os dados de uma nova turma. Mas, lembra que dissemos que os arrays tem tamanhos fixos? Como adicionar os dados de mais uma turma?

Nesse caso, criamos uma matriz 5x200, copiamos os dados da matriz antiga 4x200 para esta e em seguida inserimos as informações da quinta linha. Prontinho, um novo array multidimensional.

Isso são apenas algumas operações básicas. Podemos ir bem mais além, e fazer tudo de Álgebra Linear, e até cálculos da transformada de Fourier, em cima destes arrays.


ndarray - O coração da biblioteca NumPy

Em nossa apostila e livro de Programação Científica em Python, falamos sobre os objetos da classe ndarray da NumPy, que são a base de funcionamento dessa biblioteca, que possuem informações cruciais para podermos entender melhor como trabalhar com os arrays para propósitos científicos.

No próximo tutorial, vamos aprender como criar e inicializar arrays dos mais diversos tipos de dados.

Bibliotecas para Programação Científica - NumPy, SymPy, SciPy, Matplotlib e Pandas

 Nesta seção, de nosso curso de Programação Científica com Python, vamos te apresentar as principais bibliotecas para se trabalhar com Computação Numérica e Ciência de Dados, que são:

  • NumPy
  • SciPy
  • SymPy
  • Matplotlib
  • Pandas
  • Outros
São ferramentas que serão necessárias você instalar, para dar continuidade em nosso curso.

NumPy - O pacote fundamental da Computação Científica

Essa biblioteca é a base de toda a computação numérica (Numerical Python), que usamos para trabalharmos com Array, especificamente.

Pacote NumPy para Data Science e Machine Learning


Embora tenha muita semelhança com as Listas, os arrays tem uma característica especial de ser possível fazer operações aritméticas com eles, diferente dos outros tipos de sequências.

Com a library do NumPy, vamos aprender a armazenar dados em um array e como manipular essas informações de uma maneira bem fácil. Se é da área de exatas, certamente já ouvir falar em matrizes, que no mundo da computação científica é conhecida por array multidimensional, também tratadas pelo NumPy.

O que é possível fazer com o NumPy:
  • Criar, adicionar, remover e ordenas os elementos de um array
  • Alterar tamanhos e formatos de arrays e matrizes
  • Fazer operações aritméticas com arrays
  • Achar elementos máximos, mínimos, médias, soma etc
  • Gerar números aleatórios
  • Fazer cálculos matemáticos, como raiz quadrada, somatório, funções trigonométricas, hiperbólicas, arredondamentos, expoentes, logaritmos, numéricos completos, Bessel etc
  • Álgebra linear
  • Estatística
  • Operação com bits
Documentação oficial do NumPy:

Como instalar o NumPy:
Se estiver usando o Jupyter notebook, não precisa fazer nada.

Para trabalhar diretamente numa IDE em sua máquina, utilize o pip no terminal de comandos de seu sistema operacional:
  • pip3 install numpy
Ou
  • pip install numpy

SymPy - Símbolos científicos em Python

Não sei se já percebeu, mas quase tudo em programação é feito através de números e textos, corretos?

Mas, e para exibir o símbolo de uma integral?
E de um somatório? Uma equação ordinária?
Imagine ter que estudar e lidar com uma função que tem trigonometria, logaritmo, números complexos etc, e tudo em uma fração?

É aí que entra a biblioteca SymPy (Symbolic Python). Com ela, além de fazer todos os cálculos possíveis que usualmente fazemos, ele exibe os símbolos (como o da raiz quadrada, a divisão com numerador em cima e denominador embaixo e tudo mais o que você puder fazer no papel, faremos no Python. 
Biblioteca Sympy para computação matemática
Com o SymPy, podemos trabalhar com:

  • Polinômios (fatorar, decompor, dividir...)
  • Cálculo (limite, derivada, integral, série de Taylor)
  • Equações (polinomiais, algébricas, diferencial, diofantinas e sistemas)
  • Análise Combinatória (combinação, permutação, arranjos, binômio de Newton)
  • Fórmulas de Física
  • Matemática discreta e Lógica
  • Matrizes (determinantes, autovalor/vetor)
  • Geometria
  • Estatística
  • Cristografia
  • Gráficos (plot)
Vejam um exemplo bonitinho no Jupyter notebook:
Fórmulas de Física no Python

Para instalar o Sympy: 

  • pip install sympy ou 
  • pip3 install sympy

Documentação oficial do SymPy:

https://docs.sympy.org/latest/index.html


SciPy - O Python na Computação Científica

As duas bibliotecas anteriores são usadas para cálculos matemáticos, no geral. E são essenciais, afinal a Matemática é a base para toda a ciência, principalmente de exatas.

Mas é com a library SciPy que vamos adentrar, especificamente, nas ciências, com a programação em Python.
SciPy scientific library


Ela se dá especialmente bem com a NumPy, principalmente quando precisamos fazer otimizações e integrações numéricas, tanto que sua estrutura de dados básica é o array multidimensional (matriz).

O SciPy acaba por 'estender' algumas funcionalidades do NumPy, generalizando mais algumas funções, como as da álgebra linear e da transformada de Fourier, por exemplo.

A biblioteca SciPy é mais usada, principalmente, para:
  • Equações algébricas
  • Equações diferenciais
  • Interpolação
  • Problemas envolvendo autovalor
  • Integração
  • Otimização
  • Funções e distribuições estatísticas
  • Algoritmos fundamentais para todas as ciências
  • Processamento de Sinais
  • Processamento multidimensional de imagens
  • Transformadas de Fourier
  • Spatial data structures (sistemas de informações geográficos, computação gráfica, robótica e outras áreas)
Veja um exemplo de uso da SciPy com o software de mapas e informações geográficas ArcGis:
Computação científica com Python

Para instalar o SciPy: 

  • pip install scipy ou 
  • pip3 install scipy
Guia oficial do usuário SciPy:

Matplotlib - Gráficos e visualizações de dados

Agora que já aprendemos quais as ferramentas que existem e que usaremos para fazer cálculos numéricos, precisamos de uma maneira para exibir essas informações.

E é aí que entra a poderosa biblioteca Matplotlib, de mathematical plotting library, cujo propósito é o de exibir saídas e visualizações, que é algo bem mais amplo e poderoso do que simplesmente 'exibir gráficos', como veremos ao longo de nosso curso de Programação Científica com Python.

Com pouquíssimas linhas de código seremos capazes de construir os mais diversos tipos de imagens e gráficos, em excelente resolução e de maneira bem flexível e configurável. Se já usou o MATLAB alguma vez, saiba que vai ter tudo o que ele oferece, e muito mais, graças ao poder e versalidade do Python.

A título de curiosidade, essa library foi criado por um neurocientista e biólogo, chamado John Hunter, mostrando que cientistas também podem se tornar exímios programadores. Não sinta medo se aparecer algo estranho ou difícil, em primeiro momento. Com o tempo e prática, vai ver que programar é uma das coisas mais simples e belas de se fazer.

Confesso que foi uma tarefa árdua achar imagens que ilustrassem o que é possível fazer com o Matplotlib:
Como criar gráficos em Python

Por isso, convido todos a digitarem 'matplotlib' no Google imagens e ver a infinidade de possibilidades que essa biblioteca do Python nos fornece:
Gráficos para Ciência de dados

A biblioteca do Matplotlib nos fornecesse a possibilidade de se criar e trabalhar com:
  • Plot de linhas
  • Plot scatter (gráficos de dispersão)
  • Plot stem (Diagrama de ramos e folhas)
  • Plot em 2D e 3D
  • Plot de contorno
  • Plot polares
  • Stack Plot (gráficos de pilha)
  • Box Plot (gráficos de caixa)
  • Error Plot (margem de erro)
  • Violin Plot
  • Plot de mapas de cores
  • Plot interativos (suportam tratamento de eventos e possibilidade de se mudar os dados de maneira dinâmica)
  • Gráficos de barra
  • Gráficos de pizza (pie chart)
  • Histograma
  • Customização de figuras, legendas, rótulos, eixos, títulos, subplots, grids de imagens etc
  • Mapas e projeções cartográficas (Basemap e Cartopy)
  • Portável e multi-plataforma
  • Integração com outras ferramentas, com o LaTeX e o Microsoft Excel
  • Qualidade de imagens do nível de publicações científicas
  • Total integração com o NumPy
  • Integração com o Jupyter Notebook
  • Possibilidade de se trabalhar com animações e renderizações rápidas
Para instalar o Matplotlib, acesse o terminal de comando de seu sistema operacional e digite:
pip install matplotlib
ou
pip3 install matplotlib

Veja a documentação oficial do Matplotlib em:

Pandas e a ciência de dados (data science)

Certamente você já ouviu falar em ciência de dados (ou mais especificamente, análise e processamento de dados). Se tornou algo tão grande, tão importante e com tão poucas pessoas que tem conhecimento na área, que é comum de ouvirmos falar até em meios não-acadêmicos, como na TV mesmo ou como propaganda em alguma rede social sua.

Em nosso curso de computação numérica com Python, iremos utilizar a poderosíssima e famosa biblioteca pandas, que vai nos permitir fazer uma vasta gama de operações com todos os tipos de dados que você imaginar.

Iremos aprender a trabalhar com Series e Dataframes (dados em série e tabela de dados), mais precisamente quebrando essas informações, unindo, classificando, agrupando, extraindo estatísticas, percebendo padrões, convertendo dados etc.

Por exemplo, vamos supor que o órgão oficial da sua cidade está coletando informação de onde chove, em 10 locais de sua cidade. Pega informações a cada hora. Ou seja, 240 dados diariamente (10mm de chuva, 15mm de chuva, 0 mm de chuva etc).

Se você pegar um mês desses dados, vai ter mais de 7000 informações, porém não vai conseguir concluir nada. Afinal, você analisou só um mês.

Mas vamos supor que você consiga 20 anos dessas informações. São quase 2 milhões de dados.
Dá pra fazer algo manualmente? Bem inviável, concorda?

É aí que entra a programação em Python e, especificamente, o pandas. Podemos pegar os dados ano a ano e ver como ele se comporta. Que anos choveu mais ou menos? Ou foi estável? É possível notar mudanças climáticas em sua cidade, e usar isso em um artigo acadêmico.

E que tal agora a gente selecionar por mês? Quanto que choveu em cada mês, de cada ano? Tem meses que chovem mais? Certamente, apenas olhando os dados, você saberia dizer que época chove mais, quanto que chove, que meses tem seca (assim, gerar informações para a criação de projetos contra seca ou alagamentos!), e por aí vai.

Veja bem, é possível analisar milhões e milhões de dados desses, com pouquíssimas linhas de código, extrair todo tipo de informação que você possa imaginar e até mostrar isso de maneira gráfica.

O motivo do nome ser pandas é porque pandas são fofos, e é simplesmente apaixonante trabalhar com esta biblioteca:
Curso de ciência de dados com Python


Documentação do pandas

Adivinha? Para instalar o pandas, digite o comando:
pip install pandas
ou
pip3 install pandas

No terminal de comando de seu sistema operacional.

Machine Learning e a Inteligência Artificial

Assim como a ciência de dados, muitíssimo provavelmente você ouviu falar num campo de estudo e trabalho chamado Machine Learning, ou aprendizado de máquina, em nossa língua.

Em nossa apostila Programação Científica em Python, iremos apresentar uma biblioteca para aprender e trabalhar com Machine Learning, vamos aprender como criar programas que irão detectar padrões em dados, ver coisas que nós humanos não conseguimos ver, através da teoria do aprendizado computacional.

Inteligência artificial em Python

Sim. É possível programarmos e ensinarmos as máquinas a: 
  • Reconhecer padrões
  • Aprender com erros
  • Criação de algoritmos
  • Fazer previsões
  • Tomar decisões

E tudo isso é a base para toda a inteligência artificial.

Ficou satisfeito com o que é possível fazer nas ciências, com o Python?
Pois bem, não mostrei nem 1% do que é possível. Bem vindo ao fantástico mundo da programação.

Chega de moleza com sua máquina, nos próximos tutoriais vamos colocar a mão na massa e aprender como fazer o hardware pegar fogo, de tanto trabalhar e calcular.

Como Gerar Números Aleatórios em Python - A Biblioteca random

Neste tutorial, vamos aprender como gerar números aleatórios usando o módulo random da biblioteca padrão do Python.

Tutorial anterior: Como criar, importar e usar Módulos
Veja também: Como entrar no mercado de trabalho Python



Números Aleatórios - Por que usar ?

A utilidade de se gerar números aleatórios, são enormes.

Um exemplo bem claro e muito utilizado, são em jogos.
Rolar os dados, escolher inimigos e personagens aleatoriamente, localização nos mapas, alguns games ficam 'sorteando' coisas (skins, gemas, poder, equipamentos etc), tudo isso através de números aleatórios.

Já perdeu a senha ou fez algum cadastro que necessitava receber um código numérico ou alfanumérico (tipo, 23&6342h) em seu e-mail ou via SMS? Pois é, aquele código é gerado aleatoriamente.

Muitas vezes, para fazer simulações, principalmente científicas e de outros cunhos acadêmicos, é necessário usar uma enormidade de números aleatórios.

Se já teve uma cadeira de Probabilidade e Estatística na faculdade, sabe que se usa bastante números aleatórios.

São um dos conceitos mais importantes no mundo da computação, e vamos aprender agora a usar a biblioteca random (random module) em Python.

Gerar Número Inteiro Aleatório: A Função randint

Primeiro, vamos aprender como gerar um número, aleatoriamente, que seja um inteiro.




Para isso, vamos usar a função randint, da biblioteca padrão do Python, a random. Ou sej, bem no início, devemos importar esse módulo:
import random

Agora, vamos usar a randint para gerar um número.
Essa função tem dois parâmetros, vamos chamar de inicio e fim:
random.randint(inicio, fim)

Essa função retorna um número inteiro de 'inicio' até 'fim' (inclusive eles).
Por exemplo:
  • randint(1,10): pode gerar qualquer número do 1 até o 10
  • randint(1,1000): pode resultar qualquer número 1,2, 3, ..., 100

Exemplo de uso da função randint()

Crie um programa em Python que simula o resultado de um dado, ou seja, gera números aleatórios de 1 até 6, quantas vezes o usuário desejar.

Como explicado, a primeira coisa é importar a biblioteca random, padrão do Python. Depois, simplesmente usar a função randint com 1 e 6 como argumentos, veja como fica:

import random

continuar=1
while continuar:
    print("Número aleatório gerado:", random.randint(1,6))
    continuar=int(input("Gerar novamente?\n1.Sim\n0.Não\n")


Definindo Melhor o Intervalo: randrange()

A função randrange é bem similar a função range (leia novamente esse tutorial para relembrar), exatamente a mesma maneira de se usar os parâmetros, a diferença que ela vai retornar apenas um valor.



  • Um argumento:
random.randrange(x) - vai gerar um número aleatório de 0 até x-1
Por exemplo:
random.randrange(5) - Pode retornar:0, 1, 2, 3 ou 4

  • Dois argumentos:
random.randrange(x,y) - vai gerar um número de x até y-1
Por exemplo:
random.randrange(1,5) - Pode sair:1, 2, 3 ou 4

  • Três argumentos:
 random.randrange(x,y,z) - Pode gerar de x até y-1, mas ao invés de 1 em 1, ela 'pula' de z em z, ou seja, z é o salto.

Por exemplo:
random.randrange(0,10,2) - Vai gerar uma dos seguintes números: 0, 2, 4, 6 ou 8 (ou seja, todos os pares de 0 até 8).

Para gerar todos os números múltiplos de 3 menores que 100, fazemos:
random.randrange(0, 101, 3) : 3, 6, 9, ..., 99

Gerar Número Aleatório Decimal: random()

Nos exemplos anteriores, as funções geram e recebem apenas números inteiros, ou seja, não servem para se trabalhar com números decimais.

Mas, e se a gente quiser um número quebrado aleatório?
Aí usamos a função random(), ela não recebe nenhum argumento.

Usou  ela, então te retorna decimal de 0.0 até 1.0
Basta fazer: random.random() e terá seu número quebrado aleatório.

Definir Aleatório Flutuante: função uniform()

Existe ainda mais uma função parar gerar valores flutuantes de maneira aleatória, que é através da função uniform().

Esta função recebe dois argumentos, um valor de início e outro final, podem ser valores float e te retorna um float aleatório.

Por exemplo, vamos supor que você é professor, tem que entregar a nota de 200 alunos e está totalmente sem saco.

Então você decide que vai dar notas aleatórias, de 5.0 até 10.0
Basta usar a função uniform:
random.uniform(5.0 , 10.0)

Pronto, ela vai te retornar uma nota rapidinho :D
Agora é curtir suas férias.

Caso tenha medo que algum aluno reclame, é só dizer 'olha, posso até recorrigir sua prova, mas se eu encontrar mais erros, eu abaixo sua nota).

Exercício Proposto

Crie um script em Python que gere 6 números aleatórios para a Mega-Sena (neste jogo, você pode escolher dezenas de 1 até 60). Não pode repetir dezena.

Deixe no comentário sua solução.