Ders 05: Diziler ve Matrislere İlişkin Alıştırmalar

  1. $NumPy$ $min$, $max$ ve $average$ fonksiyonlarını kullanarak aşağıda verilen a dizisinin minimum, maksimum ve ortalama değerlerini, $argmin$ ve $argmax$ fonksiyonlarını kullanarak minimum ve maksimum değerlerin denk geldiği indeksleri bulunuz.
$$ a = np.array([2.5, 3.2, 9.1, -12.2, 1.8, 23.4, -16.9, 1.3, 2.6]) $$
In [26]:
import numpy as np
a = np.array([2.5, 3.2, 9.1, -12.2, 1.8, 23.4, -16.9, 1.3, 2.6])
print("min(a): {:.1f} degeri {:d}. indekstedir".format(np.min(a), np.argmin(a)))
print("max(a): {:.1f} degeri {:d}. indekstedir".format(np.max(a), np.argmax(a)))
print("ortalama(a): {:.1f}".format(np.average(a)))
min(a): -16.9 degeri 6. indekstedir
max(a): 23.4 degeri 5. indekstedir
ortalama(a): 1.6
  1. Aynı dizi için bu kez $NumPy$ dizi nesneleri üzerinde tanımlı $min$, $max$, $mean$ metotlarını (ing. attribute) kullanarak aynı işlemleri gerçekleştiriniz. Bir önceki sorudaki ile aradaki farklara dikkat ediniz.
In [11]:
import numpy as np
a = np.array([2.5, 3.2, 9.1, -12.2, 1.8, 23.4, -16.9, 1.3, 2.6])
print("min(a): {:.1f} degeri {:d}. indekstedir".format(a.min(), a.argmin()))
print("max(a): {:.1f} degeri {:d}. indekstedir".format(a.max(), a.argmax()))
print("ortalama(a): {:.1f}".format(a.mean()))
min(a): -16.9 degeri 6. indekstedir
max(a): 23.4 degeri 5. indekstedir
ortalama(a): 1.6
  1. Fahrenheit (F) dereceyi Kelvin'e (K) çeviren bir fonksiyon yazınız. $isinstance$ fonksiyonunu kullanarak yazdığınız bu fonksiyonun bir liste, demet ya da NumPy dizisi (array) içinde gönderilen değerlerin yanı sıra herhangi bir tam sayı ya da kayan noktalı sayı nesnesine de uygulanabilmesini sağlayınız. Fonksiyonunuzu farklı türde nesnelerle test ediniz.
In [16]:
import numpy as np  
def F2K(x):
    """
    Fahrenheit dereceyi Kevine ceviren fonksiyon
    x: liste, demet, dizi, tam ya da kayan noktali sayi
    formatinda Fahrenheit derece
    """
    # x kayan noktali ya da tam sayi ise
    if isinstance(x, (float, int)):
        return (x-32)*5/9 + 273.15
    # x liste ya da demet nesnesi ise
    elif isinstance(x, (list, tuple)):
        Klist = []
        for F in x:
            Klist.append((F-32)*5/9 + 273.15)
        if isinstance(x, list):
            return Klist
        # demet nesnesi degisitirilemez oldugundan
        # hazırlanan listeyi demete donusturmek gerekir
        elif isinstance(x, tuple):
            return tuple(Klist)
    # x bir NumPy dizisi ise
    elif isinstance(x, np.ndarray):
        Karray = np.zeros(x.shape, x.dtype)
        Karray = (x-32)*5/9 + 273.15
        return Karray
    else:
        raise TypeError\
        ("x <int>, <float>, <list>, <tuple> ya da <np.ndarray>, turlerinden biri olmali {:s} degil!".\
         format(str(type(x))))
F = 90
print(type(F),F2K(F))
F = 115.5
print(type(F),F2K(F))
F = list(range(70, 100, 5))
print(type(F),F2K(F))
F = tuple(list(range(70, 100, 5)))
print(type(F), F2K(F))
F = np.linspace(80, 105, 5)
print(type(F), F2K(F))
<class 'int'> 305.3722222222222
<class 'float'> 319.5388888888889
<class 'list'> [294.26111111111106, 297.0388888888889, 299.81666666666666, 302.59444444444443, 305.3722222222222, 308.15]
<class 'tuple'> (294.26111111111106, 297.0388888888889, 299.81666666666666, 302.59444444444443, 305.3722222222222, 308.15)
<class 'numpy.ndarray'> [299.81666667 303.28888889 306.76111111 310.23333333 313.70555556]
  1. 0 ile 5 arasında 0 ile 5 dahil 6 tam sayıdan oluşan $b$ adında bir $NumPy$ dizisi yaratınız.a) Bu dizideki her bir sayının faktöriyelini $numpy.math.factorial$ fonksiyonu ile bir döngü dahilinde bulup $bfact$ isimli bir başka $NumPy$ dizisinde toplayınız. b) Bu dizinin tümünün birden faktöriyellerini $scipy.special.factorial$ fonksiyonu ile tek bir kerede hesaplayıp $bfact\_yeni$ isimli dizide toplayınız.
In [24]:
import numpy as np
import scipy.special
b = np.array(range(6), dtype=int)
print("b: ", b)
# Sifirlardan olusan bir dizi olusturup
#bfact = np.zeros(len(b), dtype=int)
# elemanlarini degistirebileceginiz gibi
# b dizisinin bir kopyasini da alabilirsiniz.
bfact = b.copy()
for i,sayi in enumerate(b):
    from math import factorial
    bfact[i] = np.math.factorial(sayi)
print("bfact: ", bfact)
bfact_yeni = scipy.special.factorial(b)
print("bfact_yeni: ", bfact_yeni)
b:  [0 1 2 3 4 5]
bfact:  [  1   1   2   6  24 120]
bfact_yeni:  [  1.   1.   2.   6.  24. 120.]
  1. İki boyutlu (satır ve sütundan oluşan) kendi yazacağınız herhangi bir $NumPy$ dizisindeki satır ve sütun sayılarını dilimlemeler, $len$ fonksiyonu ve $shape$ metodunu (ing. attribute) kullanarak elde edip, ekrana yazdırınız.
In [31]:
import numpy as np
a = np.array([list(range(5)), list(range(5,10)), list(range(10, 15))])
print("a: ", a)
# len fonksiyonu bir Numyp dizisine uyguladiginizda
# size satir sayisini verir
print('Satir sayisi: len(a): ', len(a))
# Herhangi bir satira uyguladiginizda ise o satirdaki
# eleman sayisini yani sutun sayisini alirsiniz
print('Sutun sayisi: len(a[0,:]): ', len(a[0,:]))
# shape metodu size dizinin n. boyutunun buyuklugunu verir
# 0. boyut satir iken , 1. boyut sutundur
print('Satir sayisi a.shape[0]: ', a.shape[0])
print('Sutun sayisi: a.shape[1]: ', a.shape[1])
a:  [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
Satir sayisi: len(a):  3
Sutun sayisi: len(a[0,:]):  5
Satir sayisi a.shape[0]:  3
Sutun sayisi: a.shape[1]:  5
  1. Herhangi iki boyutlu (5. soruda oluşturacağınız gibi) bir $NumPy$ disininin tüm elemanlarını önce satır, sonra sütun üzerinden tarayarak sırayla ekrana yazdırınız. Çıktıda önce 1. satırdaki sayılar sırayla alt alta ekrana yazılmalı, sonra 2. satıra geçilip aynı sırayla devam edilmelidir.
In [32]:
for i in range(a.shape[0]): # a.shape[0] yerine len(a) da kullanabilirsiniz
    for j in range(a.shape[1]): # a.shape[1] yerine len(a[i,:]) de kullanabilirsiniz
        print('{:d}. satir, {:d}. sutun: {:f}'.format(i,j,a[i,j]))
0. satir, 0. sutun: 0.000000
0. satir, 1. sutun: 1.000000
0. satir, 2. sutun: 2.000000
0. satir, 3. sutun: 3.000000
0. satir, 4. sutun: 4.000000
1. satir, 0. sutun: 5.000000
1. satir, 1. sutun: 6.000000
1. satir, 2. sutun: 7.000000
1. satir, 3. sutun: 8.000000
1. satir, 4. sutun: 9.000000
2. satir, 0. sutun: 10.000000
2. satir, 1. sutun: 11.000000
2. satir, 2. sutun: 12.000000
2. satir, 3. sutun: 13.000000
2. satir, 4. sutun: 14.000000
  1. Bir önceki soruda satır-sütun sırasıyla taradığınız iki boyutlu diziyi bu kez sütun-satır sırasında tarayınız. Yani çıktınızda önce 1. sütundaki sayılar alt alta ekrana yazılırken, sonra 2. sütuna geçilmelidir...
In [33]:
for j in range(a.shape[1]): # a.shape[1] yerine len(a[0,:]) de kullanabilirsiniz
    for i in range(a.shape[0]): # a.shape[0] yerine len(a[:, j]) de kullanabilirsiniz
        print('{:d}. satir, {:d}. sutun: {:f}'.format(i,j,a[i,j]))
0. satir, 0. sutun: 0.000000
1. satir, 0. sutun: 5.000000
2. satir, 0. sutun: 10.000000
0. satir, 1. sutun: 1.000000
1. satir, 1. sutun: 6.000000
2. satir, 1. sutun: 11.000000
0. satir, 2. sutun: 2.000000
1. satir, 2. sutun: 7.000000
2. satir, 2. sutun: 12.000000
0. satir, 3. sutun: 3.000000
1. satir, 3. sutun: 8.000000
2. satir, 3. sutun: 13.000000
0. satir, 4. sutun: 4.000000
1. satir, 4. sutun: 9.000000
2. satir, 4. sutun: 14.000000
  1. $np.linspace$ fonksiyonunu kullanarak 1 ile 4 arasında 9 kayan noktalı sayıdan oluşan bir $NumPy$ dizisi yarattıktan sonra bu diziyi $np.reshape$ fonksiyonu ile $[3x3]$ bir diziye çeviriniz ve bu dizinin devriğini (transpozesini) alınız.
In [35]:
x = np.linspace(1,4,9)
x = x.reshape((3,3))
print('x:')
print(x)
print('------------')
print('Transpoze x:')
tpx = np.transpose(x)
print(tpx)
x:
[[1.    1.375 1.75 ]
 [2.125 2.5   2.875]
 [3.25  3.625 4.   ]]
------------
Transpoze x:
[[1.    2.125 3.25 ]
 [1.375 2.5   3.625]
 [1.75  2.875 4.   ]]
  1. Aşağıdaki denklem sistemini çözmek üzere bu denklem sisteminin katsayılar matrisini ve çözümünü sırasıyla $A$ ve $R$ isimli birer $NumPy$ $matrix$ nesnesi olarak oluşturunuz. Daha sonra $A.I$ ile katsayılar matrisinin tersini alarak çözüm matrisi $R$ ile çarpınız ve bulacağınız çözüm matrisindeki $x, y, z$ bilinmeyenlerinin değerlerini ekrana yazdırınız.
$$ 2 x - 3 y + z = 1 $$$$ 5 x - 4 y - z = 2 $$$$ x + 2 z = -1 $$
In [42]:
import numpy as np
A = np.matrix([[2,-3,1],
             [5,-4,-1],
               [1,0,2]])
R = np.matrix([1, 2, -1]).transpose()
# A'nin tersi = A.I
invA = A.I
xyz = invA*R
x = float(xyz[0])
y = float(xyz[1])
z = float(xyz[2])
print('x: {:.2f}, y: {:.2f}, z: {:.2f}'.format(x,y,z))
x: -0.14, y: -0.57, z: -0.43
  1. Bir önceki soruda A matrisinin tersini alırken A.I yerine $np.linalg.inv$ fonksiyonunu kullanınız. Sonuçlarınızın doğruluğunu karşılaştırınız.
In [39]:
import numpy as np
A = np.matrix([[2,-3,1],
             [5,-4,-1],
               [1,0,2]])
R = np.matrix([1, 2, -1]).transpose()
invA2 = np.linalg.inv(A)
xyz = invA2*R
x = float(xyz[0])
y = float(xyz[1])
z = float(xyz[2])
print('x: {:.2f}, y: {:.2f}, z: {:.2f}'.format(x,y,z))
x: -0.14, y: -0.57, z: -0.43
  1. Son iki soruda çözdüğünüz denklem sistemini $np.linalg.solve$ fonksiyonu ile çözünüz. Sonuçlarınızın doğruluğunu karşılaştırınız.
In [41]:
import numpy as np
A = np.matrix([[2,-3,1],
             [5,-4,-1],
               [1,0,2]])
R = np.matrix([1, 2, -1]).transpose()
xyz = np.linalg.solve(A, R)
x = float(xyz[0])
y = float(xyz[1])
z = float(xyz[2])
print('x: {:.2f}, y: {:.2f}, z: {:.2f}'.format(x,y,z))
x: -0.14, y: -0.57, z: -0.43
  1. Aşağıdaki fonksiyonu a) $-2\pi$ ile $2\pi$ arasında ve bu sayılar dahil olmak üzere 16 eşit aralıklı sayı içeren bir $NumPy$ dizisine uygulayınız. b) Aynı fonksiyonu bu dizinin $\pi$ ile $\pi$ arasındaki değerlerine uygulayınız. $\pi$ ile $\pi$ değerlerini dahil etmek için yeterince küçük bir tolerans değeri kullanınız. İki koşulu aynı anda uygulamak üzere bu koşulları ayrı ayrı uygulayıp sonuçlarının kesişimini $np.intersect1d$ fonksiyonu ile alabilirsiniz.
$$ h(x) = \frac{1}{\sqrt{2 \pi}} e^{\frac{-1}{2}x^2} $$
In [60]:
import numpy as np
import math
def h(x):
    return 1 / (np.sqrt(2*math.pi)) * np.exp((-0.5)*x**2)

a = np.linspace(-2*math.pi, 2*math.pi, 16)
tolerans = 1e-4 # (4*pi / 16 'dan buyuk herhangi bir tolerans degeri yeterlidir)
print("a) h(a) : ", h(a))

print("b) h(a[-pi < x < pi]) : ", \
      h(np.intersect1d(a[a > -1*math.pi-tolerans], a[a < math.pi+tolerans])))
a) h(a) :  [1.06728549e-09 1.45182017e-07 9.78904771e-06 3.27162456e-04
 5.41978267e-03 4.45036551e-02 1.81136048e-01 3.65434453e-01
 3.65434453e-01 1.81136048e-01 4.45036551e-02 5.41978267e-03
 3.27162456e-04 9.78904771e-06 1.45182017e-07 1.06728549e-09]
b) h(a[-pi < x < pi]) :  [0.00541978 0.04450366 0.18113605 0.36543445 0.36543445 0.18113605
 0.04450366 0.00541978]