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
https://numpy.org/doc/stable/reference/routines.array-creation.html
np.array
(inicializa os valores)
1D (inicializa com uma lista)
2D - lista de linhas
3 e nD - tensor
ndim (numero de dimensões)
shape (tamanho da cada dimensão)
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
np.ones
, np.zeros
, np.eye
(identidade) , np.empty
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]
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
np.newaxis
...
np.slice
+ - * /
funcionam para array (operação elemento por elemento)
*
não é a multiplicação de matrizes (isso é o método dot
)
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]) )
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
X.dtype
a.dtype
c = np.array("qwert")
c.dtype
c = np.array(["qwert","asd","longo muitoooooooooooooooo longo",57])
c.dtype
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(a)
np.info(b)
X = np.array([ [1,2],
[3,4],
[5,6],
[7,8])
shape
type
itemsize
fortran
stride https://stackoverflow.com/questions/53097952/how-to-understand-numpy-strides-for-layman como achar o proximo elemento, na linha (stride[1]) e na coluna (stride[0])
data - o block de memoria com os dados brutos do array. O Python reusa o data sempre que possível, trocando o stride para representar diferentes “formatos” do array. Veja que o reshape reusa o data.
np.info(c)
reusa o data tambem.
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!