Aula 22

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.

numpy não vem pre instalado no Python.

import numpy as np

criação array

https://numpy.org/doc/stable/reference/routines.array-creation.html

np.array (inicializa os valores)

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

Sem valores iniciais diferentes

Indexação de arrays

https://numpy.org/doc/stable/reference/arrays.indexing.html

X = np.arange(1000).reshape((10,100)) 
X.shape # 10 linhas 100 colunas

X[2,3] 
X[0:4,8]
X[:,8]
X[0:4,8:10]
X[1] - 2a linha
arr = np.array([3,39,29,12])
lis = [3,39,29,12]

X[3,arr]
X[3,lis]
arr
arr[np.array([True,False,False,True])

e = np.array([True,False,False,True,False,False,True,False,False,True,False])
X[e,8]

indexação por 2 arrays - cuidado

Usar 2 arrays ou 2 listas para os indexadores ao mesmo tempo NAO faz o que vc esperaria. O numpy faz a indexação par a par nas 2 listas

X[[3,4], [11,12] ] 
X[np.array([3,4]), np.array([11,12]) ] 

X[3,11]
X[4,12]

X[[3,4], [11,12,13,14] ] 

mas veja que com slices isso funciona como esperado

X[3:5,11:15]

para ter o efeito esperado com multiplas listas de indexadores use o np.ix_

X[ np.ix_(np.array([3,4]), np.array([11,12,13,14])) ]


X[ np.ix_([3,4], [11,12,13,14]) ] - funciona para listas de indices

LEIA a parte de indexação do manual do numpy https://numpy.org/doc/stable/reference/arrays.indexing.html

Operações em arrays

a = np.array([10,20,30])
b = np.array([1,2,3])
a+b
a*b
a/b
a.dot(b)

np.dot(a,b)
a = np.array([1,2,3])
b = np.array([1,4,3])
a == b
np.greater(a,b)

diferente de listas que verificam se as 2 listas sao iguais

[1,2,3] == [1,4,3]

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

broadcast

os argumentos não precisam ter a mesmas ndim (inclusive atribuição)

a+2
4*X
np.array([1,2,3]) == 1

X % 2 == 0

X[X % 2 == 0] = -1

tipo

X.dtype
a.dtype
c = np.array("qwert")
c.dtype
c = np.array(["qwert","asd","longo muitoooooooooooooooo longo",57])
c.dtype

reshape

a = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
a
b=a.reshape((3,4))
b
c = np.reshape(a,(1,12))

note a diferença entre a e c

np.info

np.info(a)
np.info(b)
X = np.array([ [1,2],
                      [3,4],
                      [5,6],
                      [7,8])

bibliotecas de algebra linear

as operações (e algumas funções - autovalores e auto vetores, determinantes, etc) do numpy são implementadas por bibliotecas de baixo nivel que operam diretamente no data

Bibliotecas de algebra linear de baixo nivel

contiguous indica se o data pode ser enviado diretamente para a biblioteca de baixo nivel. Se nao, o numpy cria uma nova versão do array (copiado o data) de forma que possa ser usada pela biblioteca!