Pyhton "numpy" kütüphanesinin kullanımı

Numpy kütüphanesi Python'da birçok nümerik işlemi ve matris operasyonlarını etkin bir şekilde yapabilmemizi sağlar. Eğer daha önceden Matlab kullandıysanız aşağıdaki bağlantıda verilen öğreticiye (tutorial) göz atmanızı öneririm.
https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html
Hazırsanız başlayalım

DİZİLER (ARRAYS)

numpy dizileri Pyhton listelerine benzer. Temel özellikleri şunlardır

  • Hepsi aynı tipte olmalıdır
  • Pozitif olan "integer tuple" yapıları ile indeklenirler
  • Liste kullanarak numpy dizisi yaratabiliriz
  • Elemanlarına köşeli parantez kullanarak erişim sağlanabilir.
In [1]:
# Kütüphaneyi yüklüyoruz
# Genelde hep np olarak import edilir
# İsterseniz başka bir şey de diyebilirsiniz size kalmış 
import numpy as np

# np.array'in içine bir liste yazmamız yeterli
a_numpy_array = np.array([3,5,2,1])

# ekrana bastıralım
print(a_numpy_array)

# tipini görelim
print(type(a_numpy_array))

# ilk elemanına bakalım
print(a_numpy_array[0])

# bir elemanını değiştirelim
a_numpy_array[1]=42

print(a_numpy_array)
[3 5 2 1]
<class 'numpy.ndarray'>
3
[ 3 42  2  1]
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\_distributor_init.py:32: UserWarning: loaded more than 1 DLL from .libs:
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\.libs\libopenblas.PYQHXLVVQ7VESDPUVUADXEVJOBGHJPAY.gfortran-win_amd64.dll
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\numpy\.libs\libopenblas.XWYDX2IKJW2NMTWSFYNGFUWKQU3LYTCZ.gfortran-win_amd64.dll
  stacklevel=1)

Her bir dizinin içindeki veri tipini de değiştirmemiz mümkün.

In [2]:
a = np.array([1,2],dtype=np.int16)
b = np.array([1,2],dtype=np.float64)
print(a)
print(a.dtype)
print(b)
print(b.dtype)
[1 2]
int16
[1. 2.]
float64
In [3]:
# iki boyutlu bir matris yapalım
# Bunun için liste içinde iki listeye sahip bir girdi sağlamamız lazım
# Eklemeyi satır satır yapıyoruz
b_numpy_array = np.array([[2,3,4],[4,5,6]])

# İki boyutlu matrisimiz hazır
print(b_numpy_array)

# Boyutunu görmek için shape fonksiyonunu kullanabiliriz
print("\nMatrisin boyutları")
print(b_numpy_array.shape)

# Matrislere erişim için çift indekleme kullanılıyor
print(b_numpy_array[0,1]) # Birinci satır 2. sütundaki elemana erişim
[[2 3 4]
 [4 5 6]]

Matrisin boyutları
(2, 3)
3

Matrislerin satırlarını listeler halinde veriyoruz. Bu listelerin boyutlarının birbirine eşit olmasına dikkat etmekmiz gerekiyor aksi takdirde istediğimiz matrisi yaratamayız

In [4]:
# Diyelim ki bir satır diğerinden boyut olarak fazla oldu
c_numpy_array = np.array([[2,3,4],[4,5,6,7]])

print(c_numpy_array)
[list([2, 3, 4]) list([4, 5, 6, 7])]
C:\Users\Faust\.conda\envs\ax_dev\lib\site-packages\ipykernel_launcher.py:2: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  

Dizi yaratma fonksiyonları

numpy kütüphanesinin dizi yaratmak için hazır fonksiyonları da mevcuttur. Aşağıda en sık kullanılanlardan örnek vermek isiyorum.

In [5]:
# 0'lardan oluşan bir matris yaratalım
print("\nSıfır matris")
print(np.zeros((3,2)))

# Birlerden oluşan bir matris yaratalım
print("\nBirlerden oluşan matris")
print(np.ones((2,3)))

# Sabit sayılardan oluşan bir matris
print("\nSabit matris")
print(np.full((4,3),42))

# Birim (identitiy) matris
# Bu matrix simetrik olacağı için yalnızca bir parametre alıyor
print("\nIdentity matris")
print(np.eye(2))

# Rasgele matris
print("\nRasgele matris")
print(np.random.random((3,3)))
Sıfır matris
[[0. 0.]
 [0. 0.]
 [0. 0.]]

Birlerden oluşan matris
[[1. 1. 1.]
 [1. 1. 1.]]

Sabit matris
[[42 42 42]
 [42 42 42]
 [42 42 42]
 [42 42 42]]

Identity matris
[[1. 0.]
 [0. 1.]]

Rasgele matris
[[0.89266469 0.51463157 0.31528686]
 [0.42536203 0.61050886 0.17194666]
 [0.68978791 0.91208205 0.42153249]]

np.empty() fonksiyonu

Bu fonksiyon yeni bir dizi yaratır fakat dizinin içini 0'lar veya 1'ler ile dolrumaz

In [6]:
a = np.empty((2,4))
print(a)
[[0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000]
 [0.00000000e+000 6.64024228e-321 4.61788950e-287 4.96980376e-297]]

Kesit alma
Matrisleri parçalamak için kesit alma operatörleri kullanılabilir.

In [7]:
a_matrix = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
print(a_matrix)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
In [8]:
# 2. satırdan 3. satıra 2. sütundan sonuna kadar olan elemanlardan oluşan matris
print(a_matrix[1:3,2:])
# Son satırın tümünü alalım
print(a_matrix[2,:])
# Son sütunun tümünü alalım
print(a_matrix[:,3])
[[ 7  8]
 [11 12]]
[ 9 10 11 12]
[ 4  8 12]
In [9]:
# Yukarıdaki örnek matrisin (0,0) ve (1,2) numaralrı elemanlarını alalım
print(a_matrix[[0,1],[0,2]])
[1 7]

np.arange() fonksiyonu

Bu fonksiyon ardışık bir dizi oluşturur. !! Son eleman diziye dahil değildir !!

In [10]:
# 1'den 10'kadar bir dizi oluşturalım
print(np.arange(1,10))
# Dizi 2'şer artarak oluşturulsun
print(np.arange(1,10,2))
[1 2 3 4 5 6 7 8 9]
[1 3 5 7 9]

np.linspace() fonksiyonu

Bu fonsiyon np.arange() fonksiyonuna benzer. Farklı olarak verilen iki sayı arasını istenilen nokta sayısı ile doldurur. Örneğin 1 ile 10 arasında 20 nokta sayı istersek aralıkları otomatik olarak hesaplar ve bize istediğimiz diziyi döndürür.

In [11]:
a = np.linspace(1,10,20)
print(a)
print(a.shape)
[ 1.          1.47368421  1.94736842  2.42105263  2.89473684  3.36842105
  3.84210526  4.31578947  4.78947368  5.26315789  5.73684211  6.21052632
  6.68421053  7.15789474  7.63157895  8.10526316  8.57894737  9.05263158
  9.52631579 10.        ]
(20,)

Mantıksal indeksleme

Matriste belirli koşulu sağlayan elemanların bulunmasını sağlar

In [12]:
a = np.array([[1,2,5,6], [8,9,7,8], [9,10,2,42]])
print("Örnek matris")
print(a)
print("\n5'ten büyük sayıları bulmak için mantıksal indeksi yazdıralım")
print([a>5])
print("\n5'ten büyük sayıları bulalım")
print(a[a>5])
print("\n5'ten büyük sayıları 0'a eşitleyelim")
a[a>5] = 0
print(a)
Örnek matris
[[ 1  2  5  6]
 [ 8  9  7  8]
 [ 9 10  2 42]]

5'ten büyük sayıları bulmak için mantıksal indeksi yazdıralım
[array([[False, False, False,  True],
       [ True,  True,  True,  True],
       [ True,  True, False,  True]])]

5'ten büyük sayıları bulalım
[ 6  8  9  7  8  9 10 42]

5'ten büyük sayıları 0'a eşitleyelim
[[1 2 5 0]
 [0 0 0 0]
 [0 0 2 0]]
DİZİLERDE MATEMATİK İŞLEMLERİ

Eleman bazında yapılan işlemler

In [13]:
A = np.array([[1,2],[3,4]])
print("\nA matrisi")
print(A)
B = np.array([[5,6],[7,8]])
print("\nB matrisi")
print(B)

print("\nA+B")
print(A+B)
print("\nA matrisine sabit sayı ekleme")
print(A+100)
print("\nA-B")
print(A-B)
print("\nA*B")
print(A*B)
print("\nA/B")
print(A/B)
print("\nKarekök alma sqrt(A)")
print(np.sqrt(A))
print("\nÜs alma A**2")
print(A**2)
A matrisi
[[1 2]
 [3 4]]

B matrisi
[[5 6]
 [7 8]]

A+B
[[ 6  8]
 [10 12]]

A matrisine sabit sayı ekleme
[[101 102]
 [103 104]]

A-B
[[-4 -4]
 [-4 -4]]

A*B
[[ 5 12]
 [21 32]]

A/B
[[0.2        0.33333333]
 [0.42857143 0.5       ]]

Karekök alma sqrt(A)
[[1.         1.41421356]
 [1.73205081 2.        ]]

Üs alma A**2
[[ 1  4]
 [ 9 16]]

Matris işlemleri

In [14]:
print("Matris çarpımı (Dot product) A.dot(B) ")
print(A.dot(B))
print("veya np.dot(A,B)")
print(np.dot(A,B))
Matris çarpımı (Dot product) A.dot(B) 
[[19 22]
 [43 50]]
veya np.dot(A,B)
[[19 22]
 [43 50]]
In [15]:
print("Transpose alma A.T")
print(A.T)
Transpose alma A.T
[[1 3]
 [2 4]]
DİĞER İŞLEMLER

Yeniden şekillendirme
Bir diziyi yeniden şekillendirebiliriz. Yani bir vektörü matrise çevirmemiz veya tam tersini yapmamız mümkün.

In [16]:
# Uzunluğu 9 olan bir vektör yaratalım
a = np.arange(9)
print(a)

# Bunu 3x3 matris haline çevirelim
a_reshape = a.reshape((3,3))
print(a_reshape)

# Bu matrisi tekrar vektör haline getirelim
print(a_reshape.flatten())
[0 1 2 3 4 5 6 7 8]
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[0 1 2 3 4 5 6 7 8]

Matrisleri birleştirme
Matris ve vektörleri yan yana veya üst üste eklemek için np.concatenate() fonksiyonunu kullanabiliriz.

In [17]:
A = np.array([[1,2],[3,4]])
print("\nA matrisi")
print(A)
B = np.array([[5,6],[7,8]])
print("\nB matrisi")
print(B)

print("\nA ve B'yi alt alta ekleyelim")
print(np.concatenate([A,B]))
print("veya np.vstack() kullanalım")
print(np.vstack([A,B]))

print("\nA ve B'yi yan yana ekleyelim")
print(np.concatenate([A,B],axis=1)) # axis=1
print("veya np.hstack() kullanalım")
print(np.hstack([A,B]))
A matrisi
[[1 2]
 [3 4]]

B matrisi
[[5 6]
 [7 8]]

A ve B'yi alt alta ekleyelim
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
veya np.vstack() kullanalım
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

A ve B'yi yan yana ekleyelim
[[1 2 5 6]
 [3 4 7 8]]
veya np.hstack() kullanalım
[[1 2 5 6]
 [3 4 7 8]]

Matrisleri ayırma
Matrisleri ayırmak için np.split() fonksiyonu kullanabiliriz.

In [18]:
C = np.array([[1,2,3,4],[5,6,7,8]])
print(C)
print("\n")
print("Satır indeksine göre ayırma")
x,y = np.split(C, [1],axis=0)
print(x)
print(y)
print("\n")
print("Sütun indeksine göre ayırma")
x,y = np.split(C, [1],axis=1)
print(x)
print(y)
[[1 2 3 4]
 [5 6 7 8]]


Satır indeksine göre ayırma
[[1 2 3 4]]
[[5 6 7 8]]


Sütun indeksine göre ayırma
[[1]
 [5]]
[[2 3 4]
 [6 7 8]]

Eksik ve sonsuz değerleri matrise ekleme

  • "not-a-number" değerleri temsil etmek için np.nan
  • Sonsuz değerleri temsil etmek için np.inf kullanılır
In [19]:
a = np.array([[0,np.nan],[1,np.inf]])
print(a)
[[ 0. nan]
 [ 1. inf]]

Ortalama, minimun ve maximum hesaplama

  • np.mean(): Ortalama alır
  • np.min(): Minimum bulur
  • np.max(): Maximum bulur
In [20]:
a = np.array([[1,2,5,6], [8,9,7,8], [9,10,2,42]])
print(a)
print("Ortalama - vektörel olarak, yani tüm elemanların ortalaması")
print(np.mean(a))
print("Ortalama - satırların ortalaması")
print(np.mean(a,axis=0))
print("Ortalama - sütunların ortalaması")
print(np.mean(a,axis=1))

print("Minimum - vektörel olarak, yani tüm elemanların minimumu")
print(np.min(a))
print("Minimum - satırların minimumu")
print(np.min(a,axis=0))
print("Minimum - sütunların minimumu")
print(np.min(a,axis=1))

print("Maksimum - vektörel olarak, yani tüm elemanların maksimumu")
print(np.max(a))
print("Maksimum - satırların maksimumu")
print(np.max(a,axis=0))
print("Maksimum - sütunların maksimumu")
print(np.max(a,axis=1))
[[ 1  2  5  6]
 [ 8  9  7  8]
 [ 9 10  2 42]]
Ortalama - vektörel olarak, yani tüm elemanların ortalaması
9.083333333333334
Ortalama - satırların ortalaması
[ 6.          7.          4.66666667 18.66666667]
Ortalama - sütunların ortalaması
[ 3.5   8.   15.75]
Minimum - vektörel olarak, yani tüm elemanların minimumu
1
Minimum - satırların minimumu
[1 2 2 6]
Minimum - sütunların minimumu
[1 7 2]
Maksimum - vektörel olarak, yani tüm elemanların maksimumu
42
Maksimum - satırların maksimumu
[ 9 10  7 42]
Maksimum - sütunların maksimumu
[ 6  9 42]

Yegane (Unique) elemanların bulunması

  • np.unique(): dizideki yegane elemanları ve sayılarını (return_counts=True) bulur
In [21]:
a = np.array([1,2,2,1,3,4,5,3,6,42,1,3,42,3])
print(a)

u,c = np.unique(a,return_counts=True)
print("Dizideki yegane elemanlar")
print(u)
print("Dizideki yegane elemanların kaç adet oldukları")
print(c)
[ 1  2  2  1  3  4  5  3  6 42  1  3 42  3]
Dizideki yegane elemanlar
[ 1  2  3  4  5  6 42]
Dizideki yegane elemanların kaç adet oldukları
[3 2 4 1 1 1 2]