25 Eylül 2014 Perşembe

Numpy: Dizi Oluşturma

Bu bölümde sayısal verilerin depolandığı dizileri oluşturma yöntemlerini öğreneceğiz. Python programlama dili Fortran ve C türevi dillerden farklı olarak veri bloğu için fiziksel bellekteki hafıza ayarlama işini otomatik olarak yapar. Dolayısıyla biz sadece dizimizin niteliğini ve niceliğini belirtip oluşturabiliriz. Diziyle işimiz bittiğinde Python yine bizim ek bir komut çalıştırmamıza gerek kalmadan hafızada ayrılmış yeri boşaltır. Böylece diğer programlar için de yer açılmış olur.
 
Dizi Nesnesi
Python nesne tabanlı bir programlama dilidir. Bu yüzden herbir modül veya kütüphane bir sınıf olarak düşünülebilir. Bu sınıfların nesneleri temelde constructor adı verilen inşa fonskiyonları ile oluşturulur. İnşa fonksiyonlarının parametrelerini inceleyerek nesnelerimizin temelde hangi özelliklerini barındırdığını öğrenebiliriz. Aşağıdaki örneğe göz atalım.
>>> from numpy import * # Numpy kütüphanesini ad alanı ön eki olmadan ekliyoruz
>>> ndarray(shape=(2,3), dtype=float32)
array([[  3.77839489e+22,   9.18355102e-39,   1.38829441e-40],
       [ -3.76174156e-37,   7.62234898e-39,   7.00649232e-45]], dtype=float32)
İnşa fonksiyonunun bazı parametreler aldığını görüyoruz. Bunlardan shape, oluşturmak istediğimiz boyutu bildiren bağlı sıralılardır (tuples). Yukarıdaki örnekte de bu parametreyle birlikte 2x3'lük yani iki satırdan 3 sütundan oluşan bir dizi oluşturmak istediğimiz belirtmiş olduk. dtype özelliği ise bu dizide hangi tip verilerin saklanacağını belirtir. Biz burada standart 'float32' tip veri (varsayılan) türünden bir diziyi tercih ettik. Farklı tip Python veril tipleri ('int', 'float64' vb.) de dizilerde depolanabilir.
ndarray sınıfı hafızanın elverdiği ölçüde keyfi boyutlu dizileri destekler. Örneğin; aşağıda tamsayılardan oluşan 2x2x2x2'lik bir dizi oluşturulmuştur. 
>>> ndarray((2,2,2), 'int32')
array([[[ 50398851, 505910976],
        [505910976, 505910976]],
       [[ 68431072, 657601396]]]),
        [   657961,  48016344]]])
Yazımızın bundan sonraki bölümlerinde ise anlatımı kolaylaştırmak amacıyla genelde tek boyutlu dizilerle çalışılacaktır.

Elemanlara Erişim
Dizinin herhangi bir elemanına erişmek için köşeli parantez '[ ]' operatörünü kullanabiliriz. Python'da ilk indis '0'dan başlar, ve diğer programlama dillerinden farklı olarak negatif indisleri destekler. Negatif indislerde ise ilerleme yönü sondan başa doğrudur.
>>> dizi = ndarray(5) 
>>> print(dizi)
[  3.83049187e+238   3.45262638e-316   0.00000000e+000   3.83711926e+238
   6.35862486e-321]
>>> dizi[1] = 5.0  # baştan ikinci elemana değer atandı
>>> dizi[-1] = 5.0 # en sondaki elemana değer atandı
>>> print(dizi)
[  3.83049187e+238   5.00000000e+000   0.00000000e+000   3.83711926e+238
   5.00000000e+000]
Dizinin boyutu shape fonksiyonuyla elde edilir. Tek boyutlu diziler için standart kütüphanedeki len fonksiyonu da kullanılabilir. 
>>> shape(dizi)
(5,)
>>> len(dizi)
5
Diziye ait elde edilmek istenen en önemli bilgilerden biri de maximum ve minimum değerleri, ve bunların indis konumlarıdır. max/min fonksiyonları bu değerleri, argmax/argmin fonksiyonları da bu değerlerin bulunduğu indisleri bize bildirir.
>>> min(dizi)
0.0
>>> argmin(dizi)
2
>>> max(dizi)
3.837119259946211e+238
>>> argmax(dizi)
3

Ön Tanımlı Dizi Oluşturma
Numpy dizilerini oluşturmanın aslında birçok yolu vardır. İlk olarak standart liste tipindeki verilerin nasıl diziye dönüştüğünü görelim.
>>> liste = ([1,2,3])
>>> dizi = array(liste, 'float32')  # tam sayı yerine ondalıklı olarak depolar
>>> print(dizi)
[ 1.  2.  3.]
Dizileri de tolist fonksiyonuyla tekrardan listeye dönüştürebiliriz.
>>> liste = ([4,6,7])
>>> dizi = array(liste, 'int32')
>>> liste2 = dizi.tolist()
>>> print(liste2)
[4, 6, 6]
Dizi elemanlarını baştan '0' veya '1' atayarak, veya inşa fonksiyonunda olduğu gibi varsayılan değer atayarak oluşturabiliriz.
>>> dizi = zeros(4)
>>> print(dizi)
[ 0.  0.  0.  0.]
>>> dizi = ones(4)
>>> print(dizi)
[ 1.  1.  1.  1.]
>>> dizi = empty(4)
>>> print(dizi)
[  7.35794000e-295   7.01521574e-295   7.01647004e-295   7.01440942e-295]
Dizileri önceden belirli aralıklarla da oluşturabiliriz. arange fonksiyonu sırasıyla başlangıç, bitiş ve adım aralığını parametre olarak alıp bitiş noktasının dahil olmadığı bir dizi oluşturur. linspace başlangıç ve bitiş değerleri arasındaki istenilen sayıda eş aralıklı değer türetir. arange'ten farklı olarak linspace'te adım aralığı değil örnek sayısı parametre olarak girilir ve bitiş noktası da türetilen değerler içindedir. 
>>> arange(1,10,1)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> linspace(1,10,3)
array([1., 5.5, 10.])
logspace ise eş aralıklı örnek değerleri, istenilen tabanda logaritmik olarak verir.
>>> logspace(1, 10, N=2) # varsayılan taban değeri '10' kullanıldı
array([  1.00000000e+01,   1.00000000e+10])
>>> logspace(1, 10, N=3, base=2)
array([2., 45.25, 1024.]) # log2(2)=1, log2(45.25)=5.5, log2(1024)=10

Rastgele Dizi Oluşturma
Numpy kütüphanesindeki random sınıfı ve alt fonksiyonlarını kullanarak rastgele değerlerle doldurulmuş diziler elde edebiliriz.
>>> random.random(3)
array([ 0.5878516 ,  0.01153192,  0.84747563])
Değerler görüldüğü gibi [0,1) aralığında türetilmiştir. Eğer keyfi aralıkta olması istenirse bu uniform alt fonksiyonu kullanarak sağlanabilir
>>> # [a=3,b=5) yarı açık aralıkta rastgele N=4 adet değer
>>> random.uniform(3,5,4)
array([ 4.37716131,  3.04042835,  3.08056492,  4.89028642])

Kaynaklar:
[1] Langtangen H. P., A Primer on Scientific Programming with Python, Springer, 2009

0 yorum :

Yorum Gönder