Leitura 14 - Arrays Multidimensionais (Matrize3)

By Hans. Original: Bill Chambers



In [1]:
import sys
import numpy as np
print(sys.version) # Versao do python - Opcional
print(np.__version__) # VErsao do modulo numpy - Opcional


3.4.2 (default, Oct  8 2014, 13:08:17) 
[GCC 4.9.1]
1.9.2

In [2]:
# Criando um vetor padrao com 25 valores
npa = np.arange(25)

In [3]:
npa


Out[3]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24])

In [4]:
# Transformando o vetor npa em um vetor multidimensional usando o metodo reshape
npa.reshape(5,5)


Out[4]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In [5]:
# Podemos criar um array multidimensional de zeros usando o metodo zeros
np.zeros([5,5])


Out[5]:
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

In [6]:
# Algumas funcoes uteis
npa2 = np.zeros([5,5])

In [12]:
# Tamanho (numero de elementos)
npa2.size


Out[12]:
25

In [13]:
# Forma (numero de linhas e colunas)
npa2.shape


Out[13]:
(5, 5)

In [14]:
# Dimensoes
npa2.ndim


Out[14]:
2

In [16]:
# Pode se criar arrays com o numero de dimensoes que voce quiser
# Ex: um array com 3 dimensoes. (2 elemenso em cada dimensao)
np.arange(8).reshape(2,2,2)


Out[16]:
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])

In [18]:
# 4 Dimensoes com 4 elementos em cada (zeros como elementos)
# np.zeros([4,4,4,4])
# 4 Dimensoes com 2 elementos em cada
np.arange(16).reshape(2,2,2,2)


Out[18]:
array([[[[ 0,  1],
         [ 2,  3]],

        [[ 4,  5],
         [ 6,  7]]],


       [[[ 8,  9],
         [10, 11]],

        [[12, 13],
         [14, 15]]]])

Uma das maiores vantagens da vetorizaçao eh a possibilidade da aplicacao de inumeras operaçoes diretamente a cada um dos elementos do objeto. Tais operaçoes sao as aritmeticas, logica, aplicaçao de funçoes especificas, etc...


In [25]:
# Gerando uma semente para gerar numeros aleatorios
np.random.seed(10)

In [27]:
# Gerando uma lista de 25 numeros inteiros aleatorios entre 1 e 10
np.random.random_integers(1,10,25)


Out[27]:
array([10,  5,  1,  2, 10,  1,  2,  9, 10,  1,  9,  7,  5,  4,  1,  5,  7,
        9,  2,  9,  5,  2,  4,  7,  6])

In [40]:
#Veja que sempre obtemos a mesma sequencia aleatoria para a mesma semente]
# caso contrario, se nao reajustarmos a semente ele sempre criara uma sequencia diferente
np.random.seed(10)
np.random.random_integers(1,10,25)


Out[40]:
array([10,  5,  1,  2, 10,  1,  2,  9, 10,  1,  9,  7,  5,  4,  1,  5,  7,
        9,  2,  9,  5,  2,  4,  7,  6])

In [41]:
np.random.seed(10)
npa2 = np.random.random_integers(1,10,25).reshape(5,5)

In [42]:
npa2


Out[42]:
array([[10,  5,  1,  2, 10],
       [ 1,  2,  9, 10,  1],
       [ 9,  7,  5,  4,  1],
       [ 5,  7,  9,  2,  9],
       [ 5,  2,  4,  7,  6]])

In [43]:
npa3 = np.random.random_integers(1,10,25).reshape(5,5)

In [44]:
npa3


Out[44]:
array([[ 4, 10,  7, 10,  2],
       [10,  5,  3,  7,  8],
       [ 9,  9, 10,  3,  1],
       [ 7,  8,  9,  2,  8],
       [ 2,  5,  1,  9,  6]])

In [45]:
# Aplicando operaçoes
# comparaçoes
npa2 > npa3


Out[45]:
array([[ True, False, False, False,  True],
       [False, False,  True,  True, False],
       [False, False, False,  True, False],
       [False, False, False, False,  True],
       [ True, False,  True, False, False]], dtype=bool)

In [50]:
# Contar quantos alores temos que npa2 > npa3 (em python, TRUE eh tratato como 1 )
(npa2 > npa3).sum()


Out[50]:
8

In [55]:
# Podemos aplicar esta soma por colunas [primeira dimensao] (axis=0)
(npa2 > npa3).sum(axis=0)


Out[55]:
array([2, 0, 2, 2, 2])

In [56]:
# Podemos aplicar esta soma por linha [segunda dimensao] (axis=1)
(npa2 > npa3).sum(axis=1)


Out[56]:
array([2, 2, 1, 1, 2])

In [57]:
npa2


Out[57]:
array([[10,  5,  1,  2, 10],
       [ 1,  2,  9, 10,  1],
       [ 9,  7,  5,  4,  1],
       [ 5,  7,  9,  2,  9],
       [ 5,  2,  4,  7,  6]])

In [66]:
# OPERAÇOES VALIDAS TANTO PARA O MAXIMO QUANTO PARA O MINIMO
# Encontrando o valor maximo em toda a matrix
npa2.max()


Out[66]:
10

In [62]:
# Encontrando o valor maximo por colunas
npa2.max(axis=0)


Out[62]:
array([10,  7,  9, 10, 10])

In [64]:
# Encontrando o valor maximo por linhas
npa2.max(axis=1)


Out[64]:
array([10, 10,  9,  9,  7])

In [67]:
# Fazer a Matriz Transposta usando o metodo transpose
npa2.transpose()


Out[67]:
array([[10,  1,  9,  5,  5],
       [ 5,  2,  7,  7,  2],
       [ 1,  9,  5,  9,  4],
       [ 2, 10,  4,  2,  7],
       [10,  1,  1,  9,  6]])

In [69]:
# Fazer a Matriz Transposta usando a propriedade T
npa2.T


Out[69]:
array([[10,  1,  9,  5,  5],
       [ 5,  2,  7,  7,  2],
       [ 1,  9,  5,  9,  4],
       [ 2, 10,  4,  2,  7],
       [10,  1,  1,  9,  6]])

In [70]:
# Multiplicar esta transposta por ela mesma
npa2.T * npa2.T


Out[70]:
array([[100,   1,  81,  25,  25],
       [ 25,   4,  49,  49,   4],
       [  1,  81,  25,  81,  16],
       [  4, 100,  16,   4,  49],
       [100,   1,   1,  81,  36]])

Metodos: flatten e ravel

Estas duas propriedades sao bastante uteis quando para trabalhar com arrays multimensionais.

  • O metodo flatten unidemensionaliza o array multidimensional mantendo-o imutavel.
  • O metodo ravel unidemensionaliza o array multidimensional transformando-o em mutavel. Claramente percebemos a vantagem do metodo ravel caso queiramos alterar algum valor do array.

In [78]:
# Unidimensionalizando a matrix npa2 usando o metodo flatten [pythonizado como "flattening"]
npa2.flatten()


Out[78]:
array([10,  5,  1,  2, 10,  1,  2,  9, 10,  1,  9,  7,  5,  4,  1,  5,  7,
        9,  2,  9,  5,  2,  4,  7,  6])

In [79]:
# Unidimensionalizando a matrix npa2 usando o metodo ravel [pythonizado como "raveling"]
#npa2.flatten()
r = npa2.ravel()

In [80]:
r


Out[80]:
array([10,  5,  1,  2, 10,  1,  2,  9, 10,  1,  9,  7,  5,  4,  1,  5,  7,
        9,  2,  9,  5,  2,  4,  7,  6])

In [81]:
npa2


Out[81]:
array([[10,  5,  1,  2, 10],
       [ 1,  2,  9, 10,  1],
       [ 9,  7,  5,  4,  1],
       [ 5,  7,  9,  2,  9],
       [ 5,  2,  4,  7,  6]])

In [82]:
# Unidimensinalizando e tentando modificar o primeiro elemento para 25
npa2.flatten()[0] = 25

In [86]:
npa2 # nada deve ocorrer, o array multidimensional deve permanecer inalterado


Out[86]:
array([[10,  5,  1,  2, 10],
       [ 1,  2,  9, 10,  1],
       [ 9,  7,  5,  4,  1],
       [ 5,  7,  9,  2,  9],
       [ 5,  2,  4,  7,  6]])

In [90]:
#  Modificando o primeiro elemento no "raveled" array
r[0] = 25 # Deve alterar o valor do array original

In [91]:
npa2


Out[91]:
array([[25,  5,  1,  2, 10],
       [ 1,  2,  9, 10,  1],
       [ 9,  7,  5,  4,  1],
       [ 5,  7,  9,  2,  9],
       [ 5,  2,  4,  7,  6]])

In [96]:
# Mostrando os valores do array npa para comparar com as proximas funoes
npa


Out[96]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24])

In [93]:
# Soma cumulativa dos valores dos elemntos do array cumsum
npa.cumsum()


Out[93]:
array([  0,   1,   3,   6,  10,  15,  21,  28,  36,  45,  55,  66,  78,
        91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300])

In [98]:
# Produto cumulativo dos valores dos elemntos do array cumsum
npa.cumprod() # Resultara em zeros porque o primeiro elemento eh zero


Out[98]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0])

Elaborado por Hans Rogerio Zimermann com bases no curso Data Analysis in Python with Pandas de Bill Chambers - UDEMY.