import numpy as np

np.array([0,1,2,3,4,5])  # wektor sześcioelementowy
np.array([[1,2,3],[4,5,6],[7,8,9]]) # macierz n=3
np.eye(3) # macierz jednostkowa   
np.eye(3,dtype = np.bool_)   # jak wyżej ale z określonym typem elementów
np.diag([1,7,9])         # macierz diagonalna
np.zeros((4,5))          # macierz zerowa
np.ones((5,5))           # macierz wypelniona jedynkami

x.reshape(1,9)           # zmiana kształtu tablicy
np.arange(1,5,0.5)       # ciąg liczb od 1 do 5 (bez 5) z krokiem 0.5
np.arange(32).reshape((8, 4))
np.linspace(1,6,6)       # ciąg arytmetyczny liczb z przedziału od 1 do 6 o długości 6
x.ravel()                # zmiana tablicy na wektor
x.tolist()               # konwersja tablicy na listę
x = x.astype(np.float64) # konwersja

x.ndim                   # wymiar tablicy
x.shape                  # N-elementowa krotka określająca rozmiar dla każdego wymiaru
x.size                   # liczba wszystkich elementów
x.len                    # liczba elementów w pierwszym wymiarze
x.dtype                  # określenie typu danych

random.rand(3,4))        # rozkład jednostajny na przedziale od 0 do 1
np.random.randn(3,4)     # rozkład normalny standardowy

np.repeat("a",5)         # powtarza 5 razy napis "a" np.tile("a",5)           # powtarza 5 razy napis "a"

np.repeat([1,2,1],4)
Out[]: array([1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1])

np.repeat([1,2,3],(2,3,4))
Out[]: array([1, 1, 2, 2, 2, 3, 3, 3, 3])

np.repeat([[1,2],[3,4]],(4,5),axis = 1)   # axis = 1 - kolumna
Out[]:
array([[1, 1, 1, 1, 2, 2, 2, 2, 2],
       [3, 3, 3, 3, 4, 4, 4, 4, 4]])

np.repeat([[1,2],[3,4]],(4,5),axis = 0)    # axis = 0 - wiersz
Out[]: 
array([[1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [3, 4],
       [3, 4],
       [3, 4],
       [3, 4],
       [3, 4]])

np.append(np.array([1,2,2]),0.4)      # dodanie elementu do tablicy, wynik zawsze w  postaci wektora

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

np.append(L,np.tile(0.5,(3,1)),axis = 1)   # nowa kolumna
np.column_stack((L,[1,2,3]))               # nowa kolumna
np.insert(L,[1],[9],axis = 1)              # po pierwszej kolumnie wstawia kolumnę 9

np.append(L,np.tile(0.5,(1,3)),axis = 0)   # nowy wiersz
np.row_stack((L,[1,2,3])                   # nowy wiersz
np.insert(L,[1],[9],axis = 0)              # po pierwszym wierszu wstawia wiersz 9

np.concatenate((A,L),axis=0)               # łączenie macierzy

objekt r_
np.r_[1,1,4]
Out[]: array([1, 1, 4])

np.r_[1,[2]*5,4]
Out[]: array([1, 2, 2, 2, 2, 2, 4])

np.r_[1:4]
Out[]: array([1, 2, 3])

np.r_[1:4:0.5]
Out[]: array([1. , 1.5, 2. , 2.5, 3. , 3.5])

M = np.array([[1,2,3],[4,5,5],[1,0,9]])
np.cumsum(s) # w przypadku macierzy axis = 0 dla wiersza i axis = 1 dla kolumny
Out[]: array([ 0,  2,  6, 12, 20, 30, 42, 56, 72, 90])

np.diff(s)
Out[]: array([2, 2, 2, 2, 2, 2, 2, 2, 2])

# Indeksowanie tablic
x[2:7:2]                    # elementy od 2 do 7(bez ostatniego) oddalone od siebie  o 2  
x[[0,2,3,7]]                # indeksowanie wektorem
x[[True,True,False,False,True,True,False,False,False,True]] # indeksowanie wektorem logicznym
x[2::2]                     # bez 2 pierwszych i 2 na końcu
x[x % 2 == 0]               # wybranie elementow o wartosciach parzystych
x[3][0]                     # zerowy element trzeciego wiersza
x[(3,0)]                    # zerowy element trzeciego wiersza
x[:,2:4:1]                  # trzecia kolumna
x[0:3:1,:]                  # pierwsze trzy wiersze
x[np.ix_([0,1],[1,2])]      # wybieramy 0 i 1 wiersz oraz 1 i 2 kolumne

# Wyszukiwanie numerow indeksow elementow spelniajacych dany warunek
np.nonzero(x == 5) # numery indeksow ktorych elementy maja wartosc 5
np.nonzero(A == 1) # numery indeksow ktorych elementy maja wartosc 1
np.where(x == 2)


arr = np.random.randn(1000)
(arr > 0).sum() # sprawdza ile elementów jest większych od 0

a = (True, True, False)
b = (1, 1, 1)
c = (2, 2, 2
np.where(a, b, c)
Out[]: array([1, 1, 2]))

np.where(x > 0, 2, -2) # gdzie x > 0 podmień na 2, reszta na -2