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

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))