sábado, 18 de abril de 2020

Logaritmos com NumPy

Logaritmos com NumPy


Os logaritmos são usados para facilitar contas em que existem exponenciação. Os logaritmos são capazes de transformar produtos em soma, divisões em subtrações e potências em multiplicações.
John Napier foi o primeiro a estudar os logaritmos. Foi ele o responsável por descobrir que os logaritmos podiam ser usados para transformar produtos em soma, divisão em subtração e potenciação em multiplicação.
A descoberta de John Napier foi muito útil na época, e é até hoje. Imagine fazer multiplicações com números grandes sem uma calculadora. Com certeza não era fácil. Por isso a importância dos logaritmos. Com os logaritmos as multiplicações passavam a ser somas. Isso facilitava muita coisa.
Com o logaritmo, basicamente se responde uma pergunta: Qual é o expoente que o resultado será x usando a base 2 (ou outra base)? A biblioteca numpy fornece duas funções para trabalhar com logaritmos na base dois e na base dez, uma função pra cada base.
Exemplo
import numpy as np

log = np.log2(8)

print(log)
Nesse exemplo, obtemos a resposta para a pergunta: Qual é o expoente que o resultado será oito usando a base dois? A resposta é três porque dois elevado a três o resultado é oito.
Para descobrir qual é o expoente que o resultado será x com a base dez, podemos utilizar a função log10 da biblioteca numpy.
Exemplo
import numpy as np

log = np.log10(100)

print(log)
Nesse exemplo, obtemos a resposta para a pergunta: Qual é o expoente que o resultado será cem usando a base dez? A resposta é dois porque dez elevado a dois o resultado é cem.

E para trabalhar com outras bases?

Infelizmente a biblioteca numpy só fornece essas duas funções. Mais para nossa felicidade a biblioteca math fornece a função log. A função log pode trabalhar com qualquer base. Para usar a função log passamos dois argumentos: o resultado da exponenciação e a base.
Exemplo
from math import log

print(log(8, 2))
Nesse exemplo, obtemos a resposta para a pergunta: Qual é o expoente que o resultado será oito usando a base dois? A resposta é três porque dois elevado a três o resultado é oito.

sexta-feira, 17 de abril de 2020

Arredondando números decimais com NumPy

Arredondando números decimais com NumPy


Existem cinco formas de arredondar um número decimal com numpy:
  • Com o método trunc
  • Com o método fix
  • Com o método around
  • Com o método floor
  • Com o método ceil

Função trunc

O método trunc remove todas as casas decimais dos números. E retorna o número mais próximo de zero. Por exemplo, o número 3.4, o número mais perto de zero é o três.
Exemplo
import numpy as np

array = np.trunc([-3.4567, 3.9879])

print(array)
Note que a função retorna o número mais perto de zero, seja ele positivo ou negativo. Outra coisa importante de se notar é que mesmo sem casas decimais, o número permanece sendo um número de ponto flutuante (float). O número não foi convertido num inteiro. Apenas as casas decimais do número foram zeradas.

Função fix

A função fix faz a mesma coisa que a função trunc: zera todas as casas decimais dos números.
Exemplo
import numpy as np

array = np.fix([-3.4567, 3.9879])

print(array)

Função around

A função around arredonda o número pra cima ou pra baixo. Se a casa decimal do lado direito for maior ou igual a seis, o número será arredondado para cima. E se a casa decimal for menor ou igual a cinco, o número será arredondado para baixo.
A função around recebe dois parâmetros. O primeiro parâmetro é a lista de números para arredondar (ou um número só) e o segundo é o número de casas decimais que o resultado final deve ter.
Exemplo
import numpy as np

array = np.around([3.456, 3.984], 2)

print(array)
Repare que o resultado é uma matriz com os números 3.46 e 3.98. O primeiro número foi arredondado para cima e o segundo para baixo. Isso porque a última casa decimal do primeiro número é maior ou igual a seis, e a ultima casa decimal do segundo número é menor ou igual a cinco.

Função floor

A função floor tem o mesmo resultado que as funções trunc e fix. Ela arredonda o número decimal para o número inteiro abaixo mais próximo. Mais não converte o número num inteiro.
Exemplo
import numpy as np

array = np.floor([3.456, 3.984])

print(array)

Função ceil

A função ceil arredonda o numero decimal para o numero inteiro com maior valor.
Exemplo
import numpy as np

array = np.ceil([-3.456, 3.984])

print(array)
O resultado desse exemplo foi os números -3 e 4. Isso porque o número inteiro, mais próximo, maior que -3.456 é o -3. E o numero inteiro, mais próximo, maior que 3.984 é o 4.

Aritmética simples com NumPy

Aritmética simples com NumPy


Os operadores aritméticos podem ser usados diretamente numa matriz. Mais não podemos definir onde essa operação aritmética vai acontecer. Com a operação aritmética condicional podemos definir onde essa operação vai acontecer. A função add é um exemplo.
Nesse tutorial vamos aprender a adição, subtração, multiplicação, divisão e potenciação.

Adição

Para realizar a operação de adição utilizamos a função add. A função add soma duas matrizes e retorna uma matriz com o resultado da soma. Cada elemento da primeira matriz é somado com o elemento correspondente da segunda matriz (o primeiro elemento da primeira matriz é somado com o primeiro elemento da segunda matriz, etc).
Exemplo
import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

matriz = np.add(array1, array2)

print(matriz)

Subtração

A função utilizada para fazer a subtração, utilizando matrizes, é a subtract. Essa função subtrai os valores correspondes de cada matriz e retorna uma matriz com o resultado. Os elementos da segunda matriz são subtraídos dos elementos correspondentes da primeira matriz.
Exemplo
import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

matriz = np.subtract(array1, array2)

print(matriz)

Multiplicação

Multiply é a função utilizada para realizar multiplicações com elementos de duas matrizes.
Exemplo
import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

matriz = np.multiply(array1, array2)

print(matriz)

Divisão

A divisão é feita com a função divide. A função divide retorna o resultado da divisão com uma matriz de ponto flutuante.
Exemplo
import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

matriz = np.divide(array1, array2)

print(matriz)

Potenciação

A potenciação e feita com a função power. Power recebe duas matrizes. A primeira matriz contem os elementos base e a segunda matriz o expoente.
Exemplo
import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

matriz = np.power(array1, array2)

print(matriz)

Resto

Para saber o resto de uma divisão entre duas matrizes podemos utilizar a função mod ou remainder. As duas funções dividem os elementos da primeira matriz pelos elementos correspondentes na segunda matriz. O resultado dessas funções é uma matriz com o resto das divisões.
Exemplo com a função mod
import numpy as np

array1 = np.array([10, 8, 12])
array2 = np.array([3, 7, 5])

matriz = np.mod(array1, array2)

print(matriz)
Exemplo com a função remainder
import numpy as np

array1 = np.array([10, 8, 12])
array2 = np.array([3, 7, 5])

matriz = np.remainder(array1, array2)

print(matriz)

Quociente e resto

Se você precisar do quociente de uma divisão e o resto em matrizes separadas, você pode usar a função divmod. A função divmod recebe duas matrizes e retorna uma tupla com duas matrizes. A primeira matriz com o quociente da divisão e a segunda com o resto.
Exemplo
import numpy as np

array1 = np.array([10, 8, 12])
array2 = np.array([3, 7, 5])

matriz = np.divmod(array1, array2)

print(matriz)

Valor absoluto

O valor absoluto de um número não leva em conta a sua posição, apenas o seu valor. Para saber o valor absoluto dos elementos de uma matriz podemos utilizar a função absolute. A função absolute retorna uma matriz com o valor absoluto de cada elemento da matriz passada para a função.
Exemplo
import numpy as np

array = np.array([-2, 2, 3, -6, -12])

matriz = np.absolute(array)

print(matriz)
Note que na pratica a função absolute só retira o sinal do número.

quinta-feira, 16 de abril de 2020

Funções universais com NumPy

Funções universais com NumPy


As funções universais trabalham com objetos ndarray. E são utilizadas para a vetorização no numpy, por ser mais rápidas que a iteração dos objetos. As funções universais podem receber argumentos adicionais, como where, dtype e out. O argumento where indica onde a operação deve ocorrer. O dtype define o tipo de retorno. E out define a matriz de saída onde o retorno da função deve ser copiado.

Vetorização

Imagine que você tem duas listas, [1, 2, 3] e [4, 5, 6], e quer somar o primeiro elemento da primeira lista com o primeiro elemento da segunda lista (1 + 4). E fazer isso até o final das duas listas. Um jeito de fazer isso é iterar sobre as duas listas e somar os seus valores. A função interna do python, zip, itera sobre as duas listas e retorna uma tupla com os elementos correspondentes de cada lista: o primeiro elemento da primeira lista com o primeiro elemento da segunda lista. A função faz isso até alcançar o final das duas listas.
Com essa tupla, com os números lado a lado, só precisamos somar.
Exemplo
a = [1, 2, 3]
b = [4, 5, 6]
c = []

for i, j in zip(a, b):
  c.append(i + j)
print(c)
Utilizando a função zip o resultado seria cinco, sete e nove. Podemos obter o mesmo resultado usando a função add. Mais por que utilizar a função add? Por que a função add fornece o mesmo resultado de modo mais rápido. Isso porque a função add utiliza a vetorização ao contrario da zip que itera sobre os elementos das duas listas. A função add soma o terceiro elemento da primeira matriz com o terceiro elemento da segunda matriz, sem olhar para as outras.
Exemplo
import numpy as np
a = [1, 2, 3]
b = [4, 5, 6]
c = np.add(a, b)

print(c)

Criando sua própria função universal

Com o método frompyfunc é possível criar uma função universal. Você só precisa criar uma função normalmente e passar essa função para o método frompyfunc. O método frompyfunc recebe como parâmetros o nome da função que você acabou de criar, o numero de argumentos que essa função vai receber e o numero de objetos que essa função vai retornar. Depois disso é só atribuir o resultado do método frompyfunc a um objeto.
Exemplo
import numpy as np

def myadd(a, b):
  return a + b

myadd = np.frompyfunc(myadd, 2, 1)

print(myadd([1, 2, 3], [4, 5, 6]))

Como saber se uma função é uma função universal

Para saber se uma função é uma função universal é só utilizar a função interna do python, type. Se a função for uma função universal o valor retornado pela função type será <class numpy.ufunc="">.

Distribuição e permutação de dados com NumPy

Distribuição e permutação de dados com NumPy


Imagine que você precisa criar uma lista com valores aleatórios, mas que precisa que certos números apareçam mais vezes que outros. É possível fazer esse tipo de lista com métodos da biblioteca numpy. Esse tipo de lista é muito utilizada com data Science e estatísticas.
O módulo random têm métodos que permitem a você criar listas com números que vão aparecer mais vezes na matriz do que outros, de forma aleatória. Criando uma distribuição dos elementos na matriz de forma aleatória, mais com a densidade maior ou menor de um certo número. De acordo com a sua probabilidade.
Por exemplo, se você quer que sessenta por cento dos números de uma lista seja o número dois. A probabilidade de sair o número dois deve ser de 0,6. E se você não quer que um número apareça na lista é só definir a sua probabilidade como 0.
O método que vamos utilizar para criar essa lista é o método choice. A única diferença dos exemplos anteriores é a adição do parâmetro p, de probabilidade. Esse parâmetro recebe uma lista com a probabilidade de cada numero ser “sorteado”. Quanto maior a probabilidade, maior a chance de ele ser sorteado.
Exemplo
from numpy import random

x = random.choice([2, 4, 6, 9], p=[0.2, 0.0, 0.3, 0.5], size=(100))

print(x)
Nesse exemplo, o numero dois tem vinte por cento de chance de ser sorteado a cada novo numero. Mais isso não quer dizer que vinte por centos dos números sorteados vão ser o número dois. Significa que a quantidade de números dois vai ser próxima a vinte por cento da quantidade total de números.

Permutação de uma array

Com a permutação de uma matriz é possível embaralhar os elementos dessa matriz. A biblioteca numpy tem dois métodos para fazer a permuta: o método shuffle e permutation. O método shuffler embaralha os elementos da matriz passada como argumento e o método permutation retorna uma nova matriz, deixando a original intacta.
Exemplo
from numpy import random
import numpy as np

array = np.array([1, 2, 3, 4, 5])
# a matriz array é alterada
random.shuffle(array)

print(array)
O método permutation não alterar a matriz. Ele retorna uma nova matriz.
Exemplo
from numpy import random
import numpy as np

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

# a matriz array não é alterada
print(random.permutation(array))
print(array)

quarta-feira, 15 de abril de 2020

Números aleatórios com NumPy

Números aleatórios com NumPy


Um número aleatório é um número que não foi usado uma lógica para chegar nele. Não é possível determinar como esse valor foi concebido. Mais um número aleatório não significa um novo número todas as vezes que o programa for executado. Significa que a lógica para se chegar nesse número é desconhecida. Ou que as variáveis envolvidas no processo são incalculáveis.
A maioria dos programas que geram números aleatórios usam algoritmos específicos para gerar esses números. E se existe um algoritmo pros trás desse número é possível prever qual será o número “aleatório”. Esses números são pseudoaleatórios.
É possível criar números verdadeiramente aleatórios? Sim. Para criar números verdadeiramente aleatórios é preciso usar uma fonte externa. Por exemplo, o trafego de dados da internet, movimentos do mouse e pressionamento de teclas do teclado.
Nesse tutorial vamos utilizar números pseudoaleatórios. Os números realmente aleatórios são apenas usados em aplicativos relacionados à segurança e roletas digitais.

Gerando números aleatórios

Para gerar números pseudoaleatórios utilizamos o módulo random.
Exemplo
from numpy import random

x = random.randint(100)

print(x)
Com esse exemplo a variável x vai receber um número inteiro aleatório entre 0 e 100.

Gerando números de ponto flutuante aleatórios

O método rand retorna um número aleatório com ponto flutuante entre 0 e 1.
Exemplo
from numpy import random

x = random.rand()

print(x)

Gerando matriz com números aleatórios

Os dois métodos já mostrados acimas podem retornar matrizes com números aleatórios.

Números inteiros

Para criar uma matriz com números inteiros usamos a função randint, passando o parâmetro size. O parâmetro size determina a quantidade de números aleatórios que devem ser gerados.
Exemplo
from numpy import random

x = random.randint(100, size=(6))

print(x)
O resultado será uma lista com seis números aleatórios, entre 0 e 100.

Números com ponto flutuante

Passando a quantidade de números aleatórios que se deseja para o método rand o resultado será uma lista com a quantidade de números informada.
Exemplo
from numpy import random

x = random.rand(10)

print(x)

Gerando números aleatórios a partir de uma matriz

Se for preciso escolher um número aleatório entre um numero finito de possibilidades o método choice pode ser usado. Por exemplo, se for preciso escolher um numero aleatório entre dois, quatro, seis, nove e doze. O método choice faz isso, escolhe um número entre esses informado.
Exemplo
from numpy import random

x = random.choice([2, 4, 6, 9, 12])

print(x)
Os números, entre os quais a função deve escolher, é passada numa lista.

terça-feira, 14 de abril de 2020

Matriz filtro com NumPy

Matriz filtro com NumPy


Se for preciso criar uma matriz somente com os elementos selecionado, podemos criar uma matriz que será usada como um filtro. Essa matriz é feita com uma sequência de True e False. O elemento correspondente na matriz de filtro que for True vai ser adicionado na nova matriz. Se o elemento correspondente na matriz de filtro for False esse elemento não será adicionado.
Exemplo
import numpy as np

array = np.array([1, 2, 3, 4, 5, 6])
matriz_filtro = [True, False, True, False, True, False]
novo_array = array[matriz_filtro]
print(novo_array)
O resultado apresentado será 1, 3 e 5. Isso por que os elementos da matriz filtro é true e false em sequência.

Criando uma matriz de filtro

O cenário mais comum é criar a matriz de filtro na execução do programa. Até por que se fosse pra escolher cada elemento que vai ter na matriz, seria mais fácil criar a matriz desejada logo, sem precisar criar duas matrizes. A matriz com todos os elementos e a matriz de filtro poderiam ser deixadas de lado, e criar logo a matriz com os elementos desejados.
Imagine que você precisar tirar todos os números pares de uma matriz. Esse exemplo fica fácil se todos os elementos da matriz estiverem ordenados e sem elementos faltando. Mais e se os números não estiverem ordenados, e ainda, faltando elementos da sequência? Faça uma verificação na matriz.
Exemplo
import numpy as np

array = np.array([1, 2, 7, 4, 9, 3, 8, 5])
matriz_filtro = []

for i in array:
  if i % 2 >= 1:
    matriz_filtro.append(True)
  else:
    matriz_filtro.append(False)

novo_array = array[matriz_filtro]
print(novo_array)