quinta-feira, 28 de maio de 2020

Como executar operações aritméticas no NumPy

Como executar operações aritméticas no NumPy

Uma característica interessante das matrizes NumPy é que podemos executar a mesma operação matemática em cada elemento com um único comando.
Nota: As operações exponencial e logarítmica são suportadas.

Exemplo
import numpy as np

arr = np.array([[5, 10], [15, 20]])
# Adiciona 10 para cada elemento
print("Adicionando 10: " + repr(arr + 10))

# Multiplicando cada elemento por 5
print("Multiplicando cada elemento por 5: " + repr(arr * 5))

# Subtraindo 5 de cada elemento
print("Subtraindo 5: " + repr(arr - 5))

# Multiplicação de matrizes
arr1 = np.array([[-8, 7], [17, 20], [8, -16], [11, 4]])
arr2 = np.array([[5, -5, 10, 20], [-8, 0, 13, 2]])
print("Multiplicando duas matrizes: " + repr(np.matmul(arr1, arr2)))

# Exponencial
arr3 = np.array([[1, 5], [2.5, 2]])

# Exponencial de cada elemento
print("Taking the exponential: " + repr(np.exp(arr3)))

# Cubo de cada elemento
print("Transformando cada elemento em uma potência de 3: " + repr(np.power(3, arr3)))

Estatísticas e agregação

Como o objetivo é produzir algo útil a partir de um conjunto de dados, o NumPy oferece várias ferramentas estatísticas, como mínimo, máximo, mediana, média e soma.

Exemplo
import numpy as np

arr = np.array([[18, 5, -25],
                [-10, 30, 7],
                [8, 16, -2]])

print("Mínimo: ", arr.min())
print("Máximo: ", arr.max())
print("Soma: ", np.sum(arr))
print("Média ", np.mean(arr))
print("Mediano: ", np.median(arr))
print("Variação: ", np.var(arr))

Salvando dados

No NumPy, todos os nossos dados podem ser salvos usando o método save. Isso criará um arquivo com a extensão .npy contendo todos os nossos dados.
O método load pode carregar os dados de um arquivo .npy novamente no programa.

Fonte: How to perform arithmetic operations in NumPy?
Licença: Creative Commons -Attribution -ShareAlike 4.0 (CC-BY-SA 4.0)

O que é NumPy

O que é NumPy

O NumPy é uma biblioteca Python gratuita, equipada com uma coleção de operações matemáticas complexas, adequadas para o processamento de dados estatísticos. A biblioteca pode ser importada para o seu projeto Python da seguinte maneira:

Exemplo
import numpy as np
# aqui importamos a biblioteca numpy e demos um apelido a ela: “np”.

Dados numéricos no aprendizado de máquina

A manipulação de dados é um componente essencial nas ciências de dados e no aprendizado de máquina. No caso do aprendizado de máquina, o sistema coleta uma enorme quantidade de dados e se treina para fazer previsões precisas. Naturalmente, seria necessário executar operações aritméticas em dados numéricos para produzir algo significativo. É aqui que o NumPy entra em cena.

Funções básicas do NumPy

A principal estrutura de dados do NumPy é a matriz NumPy. Todos os dados são armazenados em matrizes. O NumPy fornece um vasto repertório de operações matemáticas e estatísticas que podem ser executadas nessas matrizes.

Fonte: What is NumPy?
Licença: Creative Commons -Attribution -ShareAlike 4.0 (CC-BY-SA 4.0)

terça-feira, 26 de maio de 2020

Visualizando um campo escalar 2D

Visualizando um campo escalar 2D

As bibliotecas matplotlib e numpy nos fornecem algumas funções uteis para a visualização de um campo escalar em 2D. Nesse tutorial vamos aprender como visualizar um campo escalar 2D de um jeito muito simples.

Como visualizar um campo escalar 2D com o Matplotlib

Para visualizar um campo escalar 2D vamos utilizar a função meshgrid, da biblioteca numpy, e a pcolormesh, da biblioteca matplotlib. A função meshgrid retorna matrizes com vetores de coordenadas. E a função pcolormesh, é chamada para mostrar a função. Veja um exemplo abaixo usando as duas funções:

Exemplo
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

x = np.linspace(-3, 3, 51)
y = np.linspace(-2, 2, 41)
X, Y = np.meshgrid(x, y)

Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)

plt.pcolormesh(X, Y, Z, cmap = cm.viridis)
plt.colorbar()

plt.show()

Executando o código acima o seu gráfico deve estar igual a este:

Nesse exemplo fica claro como uma boa escolha de cores pode ajudar na analise de dados. Na imagem os valores negativos aparecem com uma tonalidade mais para o azul e os valores positivos mais para o amarelo.

Como funciona...

A função meshgrid recebe duas coordenadas x e y, e retorna dois grids com as coordenadas de x e y. E a função pcolormesh recebe as variáveis x, y e z, assim obtemos as coordenadas corretas. A função pcolormesh é chamada para renderizar o gráfico com as coordenadas recebidas, o mesmo resultado pode ser alcançado utilizando a função imshow.

terça-feira, 19 de maio de 2020

Adicionando legenda do colormap

Adicionando legenda do colormap

Uma coisa indispensável em muitos gráficos, e que ainda não aprendemos, é adicionar uma legenda do mapa de cores. Uma legenda do mapa de cores pode tornar o seu gráfico mais legível e visualmente mais agradável. Claro que a estética é uma das últimas preocupações quando estamos criando um gráfico. O que realmente gostaríamos de mostra, quando adicionamos uma legenda ao mapa de cores, é o valor que cada cor representa no gráfico. Nesse tutorial vamos aprender como adicionar uma legenda do colormap com a biblioteca matplotlib.

Como adicionar legendas do colormap

Para esse exemplo vamos criar uma matriz 2d com valores aleatórios e adicionar uma legenda ao colormap. Veja como fazer isso no exemplo abaixo:

Exemplo
import numpy as np
import matplotlib.pyplot as plt

matriz = np.random.random((100,100))
plt.imshow(matriz, origin = 'lower', cmap = 'viridis', interpolation = 'nearest')

cb = plt.colorbar(orientation = 'horizontal', shrink = .75)
cb.set_label('Legenda do colormap')

plt.show()

Executando o código acima o seu gráfico deve ficar parecido com esse:

Com essa barra e a legenda é possível saber qual valor uma determinada cor representa.

Como funciona…

Com o método colorbar dizemos a biblioteca matplotlib que queremos adicionar uma barra ao nosso gráfico. Para facilitar o entendimento, adicionamos alguns parâmetros adicionais ao método colorbar. O parâmetro orientation define a orientação da barra, o padrão desse parâmetro é vertical. Nesse caso escolhemos horizontal, para deixar a barra na vertical é só omitir esse parâmetro. Com o parâmetro shrink definimos o quanto a barra deve ser encolhida com base no seu tamanho padrão. Já para adicionar a legenda precisamos criar um objeto colorbar e chamar o método set_label, passando como argumento o texto da legenda que queremos adicionar a barra.

Mais sobre o método imshow

Mais sobre o método imshow do Matplotlib

Com o exemplo do tutorial anterior, obtivemos alguns resultados preliminares. Nesse exemplo é possível notar que os eixos usados no gráfico são os indexes da matriz 2d que passamos para o método imshow. É possível que você queira usar outros eixos. Para fazer essa alteração precisamos passar os novos valores para o parâmetro extent. Nesse exemplo vamos utilizar os valores do quadro de amostra do mandelbrot. Para evitar digitar código repetido vamos apenas mudar a chamada a função imshow do tutorial passado, veja como fica a nova chamada ao método imshow:

Exemplo
plt.imshow(mandelbrot, cmap = cm.viridis, extent = (x_min, x_max, y_min, y_max))

Executando o código do tutorial anterior com as alterações no método imshow, que fizemos nesse tutorial, o gráfico gerado deve ser igual a esse:

Como funciona…

Quando passamos valores para o parâmetro opcional extent especificamos o sistema de coordenados que deve ser usado para renderizar os dados da matriz 2d. O parâmetro extent recebe uma tupla com quatro valores. Os dois primeiros valores da tupla devem ter os valores mínimos e máximos do eixo horizontal. E os dois últimos valores devem ter os valores do eixo vertical. Fazendo essa alteração os eixos mostram os valores que usamos para calcular o conjunto de mandelbrot.

Visualizando o conteúdo de uma matriz 2D

Visualizando o conteúdo de uma matriz 2D

Introdução

Até o momento, criamos gráficos que representam dados unidimensionais. Com esses dados fomos capazes de traçar algumas primitivas. Quando desenhamos mapas é possível visualizar a influência que dois dados tem sobre um terceiro. Imagine que você tem algumas fazendas espelhadas pelo país. Com uma rápida olhada num mapa seria possível saber qual produto cada região do país produz, de acordo com os dados de produção de suas fazendas. A biblioteca matplotlib nos fornece uma API simples para a criação mapas.

Visualizando uma matriz 2D

Nesse exemplo vamos começar com um projeto bem simples. Tudo o que queremos é visualizar o conteúdo de uma matriz 2D. E a matriz que vamos utilizar é o conjunto de Mandelbrot. O conjunto de Mandelbrot é um fractal definido como o conjunto de pontos x no plano complexo para o qual a sequência é definida recursivamente: não tende ao infinito. Para cada ponto x do plano complexo, a sequência se expande indefinidamente.

Como visualizar o conjunto de Mandelbrot

Para visualizar uma matriz 2D, primeiro precisamos criar uma matriz 2d com os valores do mandelbrot e depois precisamos chamar o método imshow passando a matriz para o método. Veja um exemplo abaixo:

Exemplo
import numpy as np
import matplotlib.cm as cm
from matplotlib import pyplot as plt

def iter_count(C, i_max):
  X = C
  for n in range(i_max):
    if abs(X) > 2.:
      return n
    X = X ** 2 + C
  return i_max

N = 512
i_max = 64
x_min, x_max, y_min, y_max = -2.2, .8, -1.5, 1.5

X = np.linspace(x_min, x_max, N)
Y = np.linspace(y_min, y_max, N)
mandelbrot = np.empty((N, N))

for i, y in enumerate(Y):
  for j, x in enumerate(X):
    mandelbrot[i, j] = iter_count(complex(x, y), i_max)

plt.imshow(mandelbrot, cmap = cm.viridis)
plt.show()

Por ser um exemplo que precisa de muito processamento, esse exemplo pode demorar um pouco para mostrar o seu resultado. Mas o resultado vai ser um fractal de Mandelbrot, igual a este:

Como funciona a função imshow

O funcionamento do método imshow é muito simples. O método recebe uma matriz 2d e para cada elemento dessa matriz o método cria um pixel. A cor do pixel é escolhida entre os valores de um mapa de imagens (no nosso caso usamos o viridis). Apesar do métod imshow criar a imagem ela não a mostra, por isso precisamos chamar o método show.

Criando um arquivo pdf com várias páginas

Criando um arquivo pdf com várias páginas

Nos tutoriais anteriores aprendemos como criar um gráfico com vários gráficos. Assim criamos um gráfico com várias imagens utilizando a biblioteca matplotlib. Desse modo podemos criar gráficos cada vez mais complexos. Desse modo é compreensível pensar que, se utilizamos a biblioteca matplotlib para exportar esse gráfico composto para um arquivo pdf, teríamos um arquivo pdf com uma pagina com vários gráficos. Mas com apenas um pouco de esforço podemos mudar essa realidade e criar um arquivo pdf com algumas páginas. Uma coisa importante de se ter em mente é que o matplotlib é uma biblioteca de plotagem cientifica e não um sistema de composição de documentos como é o caso do LaTeX. Nesse tutorial vamos aprender como criar um documento pdf com algumas páginas.

Exemplo
import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt

# Cria um objeto PdfPages com o qual salvaremos as páginas:
# A instrução with garantimos que o objeto PdfPages seja fechado corretamente
# no final, mesmo que ocorra uma exceção.

with PdfPages('multiplas_paginas_pdf.pdf') as pdf:
  plt.figure(figsize = (3, 3))
  plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
  plt.title('Página Um')
  pdf.savefig() # salva a imagem atual numa pagina do pdf
  plt.close()

  # Se LaTeX não estiver instalado vai causar um erro
  # Nesse caso mude usetex para False

  plt.rc('text', usetex = True)
  plt.figure(figsize = (8, 6))
  x = np.arange(0, 5, 0.1)
  plt.plot(x, np.sin(x), 'b-')
  plt.title('Página Dois')
  pdf.attach_note("Curva de sin(x)") # você pode adicionar uma nota ao pdf
  pdf.savefig()
  plt.close()

  plt.rc('text', usetex = True)
  fig = plt.figure(figsize = (4, 5))
  plt.plot(x, x ** 2, 'ko')
  plt.title('Página Três')
  pdf.savefig(fig) # Você pode passar um objeto figure para o método savefig
  plt.close()

  # tambem podemos adicionar metadados do arquivo pdf com o objeto PdfPages
  d = pdf.infodict()
  d['Title'] = 'Exemplo Com Múltiplas páginas'
  d['Author'] = 'Acervo Lima'
  d['Subject'] = 'Como criar um arquivo pdf com mútiplas páginas'
  d['Keywords'] = 'PdfPages multipage keywords'
  d['CreationDate'] = datetime.datetime(2020, 5, 13)
  d['ModDate'] = datetime.datetime.today()

Executando o código acima um arquivo pdf com três páginas deve ser criado na pasta do script.