sexta-feira, 10 de abril de 2020

Tipos de dados da biblioteca NumPy

Tipos de dados da biblioteca NumPy


A linguagem python tem alguns tipos de variáveis já definidos. Cada tipo de variável é utilizada para trabalhar com um tipo de dado especifico. Uma variável do tipo string é utilizada para trabalhar com sequências de caracteres. Enquanto uma variável do tipo inteiro é utilizada para trabalhar com números.
A biblioteca Numpy também tem seus tipos de dados definido. Cada um definido para trabalhar com um tipo de dado especifico.
Veja abaixo os tipos de dados que podem ser usados com a biblioteca numpy.
  • i - números inteiros
  • u - números inteiros sem sinal
  • b - boolean
  • f - números com ponto flutuante
  • c - números com ponto flutuante complexos
  • m - timedelta
  • M - datetime
  • O - object
  • S - string
  • U - string sem sinal
  • V - void

Verificando o tipo de dado de uma matriz

Com a propriedade dtype, dos objetos matriz da numpy, é possível saber qual é o tipo de dado da matriz. Essa propriedade guarda o tipo de dado da matriz. Podemos acessar essa propriedade diretamente no objeto.
Exemplo
import numpy as np

matriz = np.array([1, 2, 3])
print(matriz.dtype)
Com uma matriz de string o processo é o mesmo.
Exemplo
import numpy as np

matriz = np.array(['Melão', 'Abacaxi', 'Maçã'])
print(matriz.dtype)

Criando uma matriz com o tipo definido

Imagine que você precisa dos números 1, 2 e 3 como strings e não como inteiros. Se for criada a matriz do jeito tradicional os números vão ser do tipo int64 (inteiro). Podemos mudar esse comportamento passando o tipo de dado desejado no argumento dtype da função array.
Exemplo
import numpy as np

matriz = np.array([1, 2, 3], dtype='S')
print(matriz.dtype)
Se um elemento da matriz não poder ser convertido o erro ValueError vai ser lançado.
Exemplo
import numpy as np
try:
  matriz = np.array([1, 2, 3, 'a'], dtype='i')
except ValueError:
  print('Erro: ValueError')

Tamanho da variável

Com os tipos de dados i, u, f, S e U podemos informar o tamanho que a variável vai ocupar na memoria do computador.
Exemplo
import numpy as np

matriz = np.array([1, 2, 3], dtype='i4')

print(matriz)
print(matriz.dtype)
Nesse exemplo cada elemento da matriz vai ocupar 4 bytes na memoria do computador. Quanto maior for o tamanho da memoria ocupada pela variável, maior é a faixa de números que podem ser guardados. Nesse exemplo, cada elemento da matriz pode guardar um numero compreendido entre -2,147,483,648 a +2,147,483,647.
Exemplo
import numpy as np

a = np.array([9, 32767], dtype='i2')
b = np.array([2, 2147483647], dtype='i4')
c = np.array([1, 9223372036854775807], dtype='i8')

# 16 bytes -32,768 a +32,767
print(a)
print(a.dtype)

# 32 bytes -2,147,483,648 a +2,147,483,647
print(b)
print(b.dtype)

# 64 bytes -9,223,372,036,854,775,808 a +9,223,372,036,854,775,807
print(c)
print(c.dtype)
É interessante notar que mesmo quando criamos uma variável do tipo inteiro, de 8 bytes, e salvamos nela um numero pequeno, como o dois, ela ainda vai ocupar os 8 bytes.

quinta-feira, 9 de abril de 2020

Partindo uma matriz com NumPy

Partindo uma matriz com NumPy



Não é sempre que precisamos apenas de um elemento da matriz ou de uma matriz inteira. Muitas vezes precisamos de pedaços da matriz. Para obter esses pedaços da matriz precisamos fatiar a matriz. Quando vamos pegar um pedaço da matriz precisamos indicar de que elemento vai começar o nosso “corte” e o elemento final.
Exemplo
import numpy

matriz = numpy.array([1, 2, 3, 4, 5, 6])
print(matriz[1:4])
Nesse exemplo vamos obter os números dois, três e quatro. Isso porque o fatiamento da matriz começou no segundo elemento e foi até o quarto elemento. Lembre-se que o index da matriz começa em zero. Uma boa maneira de entender melhor é imaginar uma divisão antes de cada numero. Assim os números que colocamos entre os colchetes não contam os elementos e sim essas divisões imaginarias. Por isso é apresentado três números e não quatro.
É possível pegar os elementos do começo de uma matriz até um determinado elemento. Ou de um determinado elemento até o fim da matriz.
Exemplo
import numpy

matriz = numpy.array([1, 2, 3, 4, 5, 6])
# do primeiro elemento até o quarto elemento
print(matriz[:4])
# do quinto elemento até o último
print(matriz[4:])
Repare que na segunda vez que chamamos a função print o quarto elemento não aparece. Isso porque não contamos os elementos, mas sim a divisão imaginaria entre cada número.

Partes de uma matriz com index negativo

É possível utilizar index negativo para acessar uma parte de uma matriz. A única diferença desse modo é que o index negativo começa do fim da matriz para o começo. E o index um faz referencia ao penúltimo elemento.
Exemplo
import numpy

matriz = numpy.array([1, 2, 3, 4, 5, 6])
print(matriz[-3:-1])

Pulando elementos de um pedaço da matriz

Com as matrizes da biblioteca numpy é possível acessar um determinado numero de elementos dentro de uma faixa predefinida. Na matriz além de definir a faixa de elementos que você que acessar é possível definir o numero de elementos que vão ser salteados. Por exemplo, no exemplo acima se você quisesse obter os números um, três e cinco era só definir a faixa do elemento zero até o sexto elemento e o passo sendo dois. Lembre que nas faixas contamos as divisões imaginarias antes dos números.
Exemplo
import numpy

matriz = numpy.array([1, 2, 3, 4, 5, 6])
print(matriz[0:6:2])
Não é preciso indicar uma faixa se quiséssemos acessar todos os elementos da matriz de acordo com o passo. Assim só precisamos definir o passo.
Exemplo
import numpy

matriz = numpy.array([1, 2, 3, 4, 5, 6, 7, 8])
print(matriz[::2])

Partindo uma matriz de duas dimensões

Com as matrizes de duas dimensões o conceito é o mesmo. Primeiro indicamos o index da matriz de uma dimensão e depois indicamos a faixa que queremos acessar. Imagine que precisamos pegar os três últimos elementos dessa matriz: [[1, 2, 3], [4, 5, 6]]. Assim vamos indicar o index da matriz com uma dimensão que queremos acessar, no caso um, e definimos a faixa que queremos.
Exemplo
import numpy

matriz = numpy.array([[1, 2, 3], [4, 5, 6]])
print(matriz[1, 0:3])

Acessando dois elementos com o mesmo index

Numa matriz com duas dimensões é possível acessar dois elementos, um elemento de cada matriz, com o mesmo index. Para isso indicamos o intervalo (que deve abranger as duas matrizes) e o index dos dois elementos das matrizes.
Exemplo
import numpy

matriz = numpy.array([[1, 2, 3], [4, 5, 6]])
print(matriz[0:2, 1])
Note que o intervalo se refere às duas matrizes e o index ao index do elemento em cada matriz. Nesse caso o intervalo são as duas matrizes e o index é o do número dois e do número cinco.

Acessando elementos de uma matriz com NumPy

Acessando elementos de uma matriz com NumPy


Para acessar os elementos de uma matriz é do mesmo que acessamos os elementos de uma lista. Você pode acessar um elemento diretamente passando o seu index entre colchetes. O primeiro elemento de uma matriz e o zero, o primeiro é o segundo e assim sucessivamente.
Exemplo
import numpy

matriz = numpy.array([1, 2, 3])
print('Primeiro elemento da matriz: ', matriz[0])
print('Segundo elemento da matriz: ', matriz[1])
print('Terceiro elemento da matriz: ', matriz[2])

Acessando elementos de uma matriz com duas dimensões

Para acessar um elemento em uma matriz com duas dimensões precisamos passar o index da matriz, que queremos acessar, de uma dimensão e depois passar o index do elemento dessa matriz que queremos acessar. Por exemplo, para acessar o elemento oito da matriz: [[2, 3, 4], [9, 8, 7]] informaríamos o index da matriz de uma dimensão (um) e depois o index do elemento (um). Desse jeito teríamos acesso a segunda matriz de uma dimensão e ao segundo elemento dessa matriz.
Exemplo
import numpy

matriz = numpy.array([[2, 3, 4],[9, 8, 7]])
print(matriz[1, 1])

Acessando elementos de uma matriz com três dimensões

Acessar um elemento de uma matriz com três dimensões é fácil se você lembrar que uma matriz com três dimensões é composta por pelo menos duas matrizes de duas dimensões. Por exemplo, para acessar o elemento oito nessa matriz: [[[2, 3, 4],[9, 0, 7]], [[2, 3, 4],[9, 8, 7]]], passaríamos o index da segunda matriz (1), que é uma matriz com duas dimensões, o index da segunda matriz, que é uma matriz com uma dimensão, e por ultimo passaríamos o index do elemento, no caso o um.
Exemplo
import numpy

matriz = numpy.array([[[2, 3, 4],[9, 0, 7]], [[2, 3, 4],[9, 8, 7]]])
print(matriz[1, 1, 1])

Index negativo

Também é possível acessar os elementos de uma matriz com index negativo, assim como nas listas.
Exemplo
import numpy

matriz = numpy.array([[[2, 3, 4],[9, 0, 7]], [[2, 3, 4],[9, 8, 7]]])
print(matriz[-1, -1, -2])
É possível acessar uma matriz inteira dentro de uma matriz. Para isso é só passar o index da matriz. No exemplo acima se quiséssemos acessar a matriz [9, 0, 7], seria assim: matriz[0, 1].

Matrizes com NumPy em Python

Matrizes com NumPy em Python


O objeto, para trabalhar com matrizes (arrays) em python é o ndarray. Podemos criar um objeto ndarray com a função array. A função array pode receber qualquer tipo de dado parecido com um array, como é o caso das listas, sets, tuplas.
Exemplo
import numpy

# criando uma matriz com lista
matriz = numpy.array([1, 2, 3, 4])
print(matriz)
# criado uma matriz com tuplas
matriz = numpy.array((4, 3, 2, 1))
print(matriz)
# criando uma matriz com set
matriz = numpy.array({1, 2, 3, 4})
print(matriz)

Dimensões na matriz

As dimensões de uma matriz podem ser vista como uma camada com vários elementos. Cada elemento da matriz é uma matriz com zero dimensão. Podem existir matrizes com varias dimensões, essas matrizes são chamadas de multidimensionais. Uma matriz com uma dimensão é composta por dois ou mais elementos, uma matriz com duas dimensões é composta por duas ou mais matrizes de uma dimensão e uma matriz com três dimensões é composta por duas ou mais matrizes com duas dimensões.
Exemplo
import numpy

print('matriz com zero dimensão')
matriz = numpy.array(42)
print(matriz)
print('matriz com uma dimensão')
matriz = numpy.array([4, 3, 2, 1])
print(matriz)
print('matriz com duas dimensões')
matriz = numpy.array([[1, 2, 3, 4],[9, 8, 7, 6]])
print(matriz)
print('matriz com três dimensões')
matriz = numpy.array([[[1, 2, 3, 4],[9, 8, 7, 6]], [[1, 2, 3, 4],[9, 8, 7, 6]]])
print(matriz)

Verificando o numero de dimensões de uma matriz

Podemos verificar o número de dimensões de uma matriz utilizando o método ndim da classe.
Exemplo
import numpy

a = numpy.array(42)
b = numpy.array([4, 3, 2, 1])
c = numpy.array([[1, 2, 3, 4],[9, 8, 7, 6]])
d = numpy.array([[[1, 2, 3, 4],[9, 8, 7, 6]], [[1, 2, 3, 4],[9, 8, 7, 6]]])

print(a.ndim)
print(b.ndim)
print(c.ndim)
print(d.ndim)

Definindo o número de dimensões de uma matriz

Quando criamos uma matriz com a função array ela vai ter o numero de dimensões que passarmos para a função. Mais se quiséssemos criar uma matriz com um numero definido de dimensões, sem precisar criar cada uma das dimensões? A resposta para essa pergunta é o argumento ndmin. Com ele podemos definir o número de dimensões.
Exemplo
import numpy

matriz = numpy.array([1, 2, 3], ndmin=5)
print(matriz)
print('Número de dimensões:', matriz.ndim)

Introdução a biblioteca NumPy

Introdução a biblioteca NumPy


Numpy é uma biblioteca escrita em python, C e C++. Ela é usada para trabalhar com matrizes. Outro jeito de trabalhar com matrizes é com uma lista, mais o tipo de dado lista é muito lento. E essa e é a principal vantagem em utilizar a biblioteca numpy: a sua velocidade. A maior parte do código da biblioteca numpy é escrita em python e os algoritmos que precisam de maior velocidade de execução são escritos em C ou C++.
A biblioteca numpy é muito utilizada em big data, machine learning e tarefas matemáticas onde a velocidade é muito importante. A numpy conseguir criar objetos que são cinquenta vezes mais rápidos do que uma lista.

Instalação da biblioteca NumPy

A instalação da biblioteca numpy é muito fácil com o pip. No terminal (Linux) ou no prompt de comando digite: pip install numpy. Pronto. A biblioteca numpy já está pronta para ser usada.
Se você não tiver o pip instalado baixe e execute esse programa aqui.

Utilizando a biblioteca numpy

Com a biblioteca já instalada para utiliza-la basta importar o módulo numpy. Assim já podemos criar objetos para trabalhar com matrizes e utilizar as suas funções nos nossos projetos.
Exemplo
import numpy

matriz = numpy.array([1, 2, 3, 4, 5])
print(matriz)
É muito provável que você encontre muitos códigos, que utilizem a biblioteca numpy, com um apelido: np. Isso não afeta em nada o código é apenas uma convenção da maioria dos programadores.
Exemplo
import numpy as np

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

Verificando a versão da biblioteca NumPy

Crie um novo arquivo python e copie o seguinte código.
Exemplo
import numpy as np
print(np.__version__)
O numero da versão da biblioteca NumPy vai aparecer na tela.

quarta-feira, 8 de abril de 2020

Manipulando arquivos em Python

Manipulando arquivos em Python


Em algum momento você vai precisar acessar arquivos no disco rígido do computador. Seja para ler um arquivo ou para gravar alguma informação do programa. Por exemplo, um programa que vai fazer várias operações matemáticas sobre um numero de dados e você só precisa do resultado. Não teria problema se as operações matemáticas fossem resolvidas rapidamente. Para resolver esse problema é só gravar o resultado das operações matemáticas no disco. Para ler ou gravar arquivos no disco é utilizado a função open.
A função open recebe dois parâmetros. O primeiro é o nome do arquivo para ser aberto/criado e o segundo é como o arquivo deve ser aberto: para leitura, para adicionar conteúdo, para escrita ou criar um novo arquivo.
Exemplo
arq = open('arquivo.txt', 'r')
print(arq.readline())
Nesse exemplo o arquivo “arquivo.txt” será aberto para leitura, somente leitura.
Exemplo
# abre arquivo para leitura
arq = open('arquivo.txt', 'r')
# abre arquivo para adicionar conteúdo
arq = open('arquivo.txt', 'a')
# abre arquivo para escrita
arq = open('arquivo.txt', 'w')
# cria um arquivo, se o arquivo existe ocorre um erro
arq = open('arquivo-02.txt', 'x')
Um arquivo pode ser aberto como um arquivo de texto ou um arquivo binário.
Exemplo
# abre um arquivo binario para leitura
arq = open('arquivo.txt', 'rb')
# abre um arquivo de texto para leitura
arq = open('arquivo.txt', 'rt')
Uma forma abreviada de abrir um arquivo de texto para leitura é passando apenas um parâmetro para a função open: o nome do arquivo.
Exemplo
arq = open('arquivo.txt')
print(arq.readline())

Lendo um arquivo de texto

Para ler um arquivo de texto é utilizado a função read. A função read ler o arquivo por completo.
Exemplo
arq = open('arquivo.txt')
# lê o arquivo todo
print(arq.read())

Lendo parte de um arquivo

Por padrão a função read ler o arquivo inteiro. Para mudar esse comportamento é só passar o numero de caracteres que você deseja ler como parâmetro da função read.
Exemplo
arq = open('arquivo.txt')
# lê 29 caracteres do arquivo
print(arq.read(29))

Lendo linhas de um arquivo de texto

Ficar contando caracteres de um texto para ler uma linha não é muito produtivo. Um jeito mais eficiente de ler uma linha de um arquivo de texto em python é utilizando a função readline. A função readline retorna uma linha do arquivo. E cada vez que a função é chamada ela segue para a próxima linha. Se o arquivo de texto tem três linhas é possível ler o texto todo chamando a função readline três vezes.
Exemplo
arq = open('arquivo.txt')
print(arq.readline())
print(arq.readline())
print(arq.readline())
Outro modo de ler um arquivo de texto, linha por linha, é com o loop for.
Exemplo
arq = open('arquivo.txt')
for i in arq:
  print(i)

Escrevendo num arquivo já existente

Existem dois modos de abrir um arquivo já existente para escrita o append (a) e o write (w). Quando um arquivo é aberto com o modo append o “curso” do arquivo é colocado no final e quando é aberto com write o cursor é colocado no inicio. O modo append é utilizado para adicionar conteúdo ao arquivo e o write sobrescreve o conteúdo antigo com o novo.
Exemplo
# abre o arquivo para escrita
arq = open('arquivo.txt', 'w')
arq.write('Apaguei o conteúdo antigo! 3:)\n')
arq.close()

# abre o arquivo para adicionar conteúdo
arq = open('arquivo.txt', 'a')
arq.write('Não apaguei nada! 8|')
arq.close()

arq = open('arquivo.txt', 'r')
print(arq.read())
arq.close()

Fechando arquivos

No exemplo acima repare que utilizamos a função close três vezes. Utilizamos a função close para efetivarmos as mudanças no arquivo. Com a função close o buffer é descarregado no disco e as alterações passam a ser permanentes.

Criando um novo arquivo

Um arquivo pode ser criado com a função open passando o nome do arquivo como parâmetro e o modo de abertura do arquivo. Abrindo o arquivo no modo append (a), write (w) e create (x) um novo arquivo será criado. Com o modo append o arquivo será criado se o arquivo passado como parâmetro não existir, com o modo write o arquivo será criado se o arquivo não existir e com o modo create o arquivo será criado apenas se o arquivo não existir. Se o arquivo existir ocorre um erro.
Exemplo
# se o arquivo "umarquivo.txt" não existir ele criado
arq = open('umarquivo.txt', 'a')
# cria o arquivo se ele não existir
arq = open('umarquivo.txt', 'w')
# se o arquivo existir ocorre um erro
arq = open('umarquivo.txt', 'x')

Verificando se um arquivo existe

Para verificar se um arquivo existe vamos precisar importar do módulo os a classe path e utilizar a função exists.
Exemplo
from os import path
if path.exists('arquivo.txt'):
  print('O arquivo existe')
else:
  print('O arquivo não existe')

Deletando um arquivo

Para deletar um arquivo utilizamos a função remove do módulo os.
Exemplo
import os
os.remove('arquivo.txt')
Nesses exemplos utilizamos apenas o nome do arquivo. Porque o arquivo está na mesma pasta do arquivo do nosso programa. Para criar ou deletar arquivos em outras pastas é só passar o caminho completo do arquivo.

terça-feira, 7 de abril de 2020

Input em Python

Input em Python


Todo programa precisa em algum momento receber dados do usuário. Um jeito de fazer isso é com a função input. A função input imprime uma mensagem na tela e retorna o valor digitado.
Exemplo
a = input('Digite alguma coisa: ')
print('Foi digitado: ' + a)
O tipo de dado retornado pela função input é do tipo string. Podemos utilizar as funções int, float para converter uma string em um numero inteiro ou um numero de ponto flutuante.
Exemplo
a = input('Digite alguma coisa: ')
a = float(a)
print(type(a))
Se por algum motivo você ainda utiliza o python 2.7 a função input tem outro nome: raw_input.