Aula 21
1 Numpy
arrays em numpy são diferentes de listas ou listas de listas. Eles são mais eficientes e ninguém usa listas ou lista de listas em aplicações cientificas, que precisam ser eficientes tanto em memoria utilizada como em tempo de execução.
Veja os 3 primeiros videos em https://www.youtube.com/watch?v=rN0TREj8G7U&list=PLeo1K3hjS3uset9zIVzJWqplaWBiacTEU que mostra bem os conceitos basicos de numpy.
https://www.datacamp.com/community/tutorials/python-numpy-tutorial é um texto tambem bom
https://docs.scipy.org/doc/numpy-1.15.1/user/quickstart.html é user guide do numpy mas eu acho o texto um pouco difícil para aprender.
1.1 criaçao array
- 1D
- 2D - lista de linhas
- 3 e nD - tensor
- ndim (numero de dimensoes)
- shape (tamanho da cada dimensao)
import numpy as np a = np.array([5,4,3.1,2,5]) a X = np.array([[1,2,3],[10,20,30],[100,200,300]]) X X.ndim X.shape
- np.ones
- np.zeros
1.2 Indexacao de arrays
- tradicional
X[obj] X[2,3] e na verdada X[(2,3)]
- por slices
X = np.arange(1000).reshape((10,100)) # 10 linhas 100 colunas X[0:4,8] X[:,8] X[0:4,8:10]
- menos dimensoes
X[1] - 2a linha
- por outro array
a = np.array([3,39,29,12]) X[3,a]
- por array booleano
a a[np.array([True,False,False,True])
- indexacao por array de inteiros e por boleanos é comum em outras linguagens que tem array como tipo pre definido (R, Matlab, julia(?))
1.3 Operacoes em arrays
- + - * / funcionam para array (operação elemento por elemento)
a = np.array([10,20,30]) b = np.array([1,2,3]) a+b a*b a/b
- * nao é a multiplicacao de matrizes. Isso é o metodo .dot
- comparacoes funcionams para arrays (elemento por elemento)
np.array([1,2,3]) == np.array([1,4,3]) diferente de listas!! [1,2,3] == [1,4,3]
- broadcast - os argumentos nao precisam ter a mesmas ndim (inclusive atribuicao)
a+2 4*X np.array([1,2,3]) == 1 X % 2 == 0 X[X % 2 == 0] = -1
- broadcast para array 2D e mais é mais complicado. https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
1.4 tipo
- arrays numpy sao implementados como arrays em C - memoria contigua
- tipo np.int16 np.int32 np.float32
- e nao o inteiro do Python que é sem limite
X.dtype a.dtype
- existe o tipo caracter e sequencia de caracter
- existe o tipo np.object para apontador para qq coisa (acho)
c = np.array("qwert") c.dtype c = np.array(["qwert","asd","longo muitoooooooooooooooo longo",57]) c.dtype
1.5 reshape
- a operacao de modificar o formato de um array é barata. Não há copia dos dados
a = np.arange(12) a b=a.reshape((3,4)) id(a) id(b) np.info(a) np.info(b)
- inclui transposta (.T) criar novas dimensoes
b=a.reshape((1,12)) b=a.reshape((3,1,4))