#!/usr/bin/env python3

# Instalação
# - pip install -r requirements.txt
# - pip install numpy

import numpy as np

# Numpy: biblioteca para computação científica - funções bem otimizadas
a = np.array([1, 2, 3])
print(type(a))
print(a.shape)
print(a[0], a[1], a[2])

a[0] = 5
print(a)

b = np.array([[1, 2, 3],
              [4, 5, 6]])
print(b.shape)
print(b[0, 0], b[0, 1], b[1, 0])

# Tupla: tipo de dados imutável
tupla = (1, 2, 3, 4)
print(tupla[0])

# Cria uma matriz com zeros
a = np.zeros((2, 2))
print(a)

# Cria uma matriz com uns
b = np.ones((2, 2))
print(b)

# Cria uma matriz com 7s
c = np.full((2, 2), 7)
print(c)

# Cria uma matriz identidade
d = np.eye(2)
print(d)

# Cria uma matriz aleatória
e = np.random.random((2, 2))
print(e)

# Seleciona uma fatia da matriz
a = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12]])
b = a[:2, 1:3]
print(b)

# lista[2:3]

print('A =\n', a)
print('B =\n', b)

b[0, 0] = 77

print('A =\n', a)

# Indexação booleana
a = np.array([[1, 2], [3, 4], [5, 6]])

bool_idx = (a > 2)
print(bool_idx)

print(a[bool_idx])
print(a[a > 2])

# Tipos de dados
x = np.array([1, 2])
print(x.dtype)

x = np.array([1.0, 2.0])
print(x.dtype)

x = np.array([1, 2], dtype=np.int64)
print(x.dtype)

# """### Operações"""

x = np.array([[1, 2], [3, 4]], dtype=np.float64)
y = np.array([[5, 6], [7, 8]], dtype=np.float64)

# print(x + y)
print(np.add(x, y))

# print(x - y)
print(np.subtract(x, y))

# print(x * y)
print(np.multiply(x, y))

# print(x / y)
print(np.divide(x, y))

print(np.sqrt(x))

x = np.array([[1, 2], [3, 4]])
y = np.array([[5, 6], [7, 8]])

print(x.dot(y))
# print(np.dot(x, y))

v = np.array([9, 10])
w = np.array([11, 12])

print(v.dot(w))
# print(np.dot(v, w))

# Transposta de uma matriz
x = np.array([[1, 2], [3, 4]])

print(x)
print(x.T)
