AST415 Astronomide Sayısal Çözümleme - I. 6. Diziler ve Matrisler (NumPy Modülü)

Benzer belgeler
Pythonda değişkenlerin türlerini tanımlamaya gerek yoktur

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

HSancak Nesne Tabanlı Programlama I Ders Notları

AST409 Astronomide Sayısal Çözümleme. II. Python da Matrisler

Python ile Programlamaya Giris

Ardışık Veri Tipleri. Prof.Dr. Bahadır AKTUĞ JFM212 Python ile Mühendislik Uygulamaları. *Kaynakça bölümünde verilen kaynaklardan derlenmiştir.

Matlab da Dizi ve Matrisler. Mustafa Coşar

Python Programlama Dili

ALGORİTMA VE PROGRAMLAMA I DERS NOTU#8

Burada a değişkeninin türü integer olarak verildi. Peki biz bu ifadeyi tırnak içerisinde yazarsak ne olur?

DİZİLER. Bu ünitede yapılan örnekler Visual Studio 2010 programındaki Visual Basic programlama diliyle çözülmüştür.

BİLGİSAYAR BİLİMİ DERSİ (KUR 1) PYTHON PROGRAMLAMA DİLİ ÇALIŞMA KÂĞIDI - 1

Lambda, Map, Filter ve Dizi Tamamlama

ALGORİTMA VE PROGRAMLAMA I

2 PYTHON A GIRIŞ 13 PyCharm İle Python Projesi Oluşturma 15 Projenin Çalıştırılması 18 İlk Python Programımız 19 Açıklama Satırları 21

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

AST415 Astronomide Sayısal Çözümleme - I. 7. Grafik Çizimi

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

Veri Yapıları Laboratuvarı

D İ Z İ L E R A R R A Y S

İnternet Programcılığı Öğr. Gör. Serkan AKSU PHP de Dizi-Değişkenler, Nesneler. Dizi Oluşturma. Tek Boyutlu Diziler

Özyineleme (Recursion)

Yukarıdaki kod aksi belirtilmediği sürece sürekli çalışır. Yani ekrana sürekli Bilgisayar çıldırdı! yazısı gelir. Ancak;

>> 5*3-4+6/2^0 ans = 17 ( Matlab da sayılar arası işlemler [ +, -, /, *, ^ ] bu şekilde ifade edilmektedir.)

ALGORİTMA VE PROGRAMLAMA I

Python ile Programlamaya Giris

PYTHON PROGRAMLAMA DİLİ

Örnek 4: Örnek Özyinelemeli fonksiyon örneği Bölüm 9. C++ programlama dilinde Nesne ve sınıf

BİLGİSAYAR PROGRAMLAMA DERSİ

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Aşağıdaki programı inceleyip ekrana ne yazacağını söyleyebilir misiniz?

Matematikte Bilgisayar Uygulamaları

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Diziler (Arrays) Çok Boyutlu Diziler

disp VEYA fprintf KOMUTLARIYLA EKRANA MESAJ YAZDIRMA

Dr. Fatih AY Tel: fatihay@fatihay.net

GÖRÜNTÜ İŞLEME MATLAB DERS-4

NESNEYE YÖNELİK PROGRAMLAMA

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-10 Diziler. Yrd. Doç. Dr. Ümit ATİLA

KOCAELİ ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ. BİLGİSAYAR LABORATUVARI II FİNAL SINAVI SORU ve CEVAPLARI(I. ogr)

14 Şubat 2011 Pazartesi günü uygulamada çözdüğümüz 2. Soruyu, aynı sıra ile bu defa MATLAB kullanarak çözelim.

Eastern Mediterranean University Faculty of Arts & Sciences -- Department Of Mathematics BİLG213 BİLGİSAYAR PROGRAMLAMAYA GİRİŞ

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

1. Her marka için 3 aylık satış toplamı nedir? (Tablodaki satır toplamları)

Konular. Hafta 5 Veri Tipleri (Devam) BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

MATLAB ile ANALİZ (MIA)

Bölüm: Matlab e Giriş.

Yrd. Doç. Dr. A. Burak İNNER

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Genel Programlama II

Javascript. 1) Notepad++ aşağıdaki kodları yazıp deneme.html olarak kaydedelim. 2) Biraz önceki sayfa sadece html kodların içeriyordu.

YZM 2105 Nesneye Yönelik Programlama

Programlama Dilleri 3

YMT219 VERİ YAPILARI ÖDEV-1

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu DİZİLER

elemanlarının gezilmesine yönelik bir örnek sunulmuştur, inceleyiniz.

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

GEO182 Lineer Cebir. Matrisler. Matrisler. Dersi Veren: Dr. İlke Deniz Derse Devam: %70. Vize Sayısı: 1

MATLAB a GİRİŞ. Doç. Dr. Mehmet İTİK. Karadeniz Teknik Üniversitesi Makine Mühendisliği Bölümü

Lineer Cebir. Doç. Dr. Niyazi ŞAHİN TOBB. İçerik: 1.1. Lineer Denklemlerin Tanımı 1.2. Lineer Denklem Sistemleri 1.3. Matrisler

Bölüm 6. Veri Türleri ISBN

C++ Dersi: Nesne Tabanlı Programlama

PROGRAMINIZI ANĠ SONLANDIRMAK ĠSTEDĠĞĠNĠZ YER BĠR DÖNGÜNÜN ĠÇĠ ĠSE NE OLUR?????????

Excel de Düşeyara Vlookup) Fonksiyonunun Kullanımı

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Matlab - Giriş (İleri Yapı Statiği II. Kısım)

Dizi türündeki referanslar, dizi nesnelerine bağlanmaktadır. Dizi referansları tanımlamak bu dizinin hemen kullanılacağı anlamına gelmez...

YZM 2105 Nesneye Yönelik Programlama

İleri Diferansiyel Denklemler

MAK 210 SAYISAL ANALİZ

Bilgisayar Programcılığı. Ögr. Gör. Cansu AYVAZ GÜVEN

Bölüm 6. Diziler (arrays) Temel kavramlar Tek boyutlu diziler Çok boyutlu diziler

JAVADA DİZİ İŞLEMLERİ

MTK467 Nesneye Yönelik Programlama. Hafta 4 - Döngüler Zümra Kavafoğlu

ALGORİTMA VE PROGRAMLAMA II

MATLAB. Fen ve Mühendislik Uygulamaları ile. Doç. Dr. M. Akif CEVİZ. MATLAB de Dizi Kavramı

2.3- OPERATÖRLER ÇALIŞMA YAPRAĞI

I=[1,0,0,0;0,1,0,0;0,0,1,0;0,0,0,1] % 4x4 lük birim matris

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

İskambil Kağıtları. Bir İskambil kağıdı

Sınav Dağılım & IMKB Endeks

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Bilgisayar Programlama MATLAB

Aynı tipten çok sayıda değişken topluluğudur. X Y Score1 Score2 (0) (1) (2)...

BPR152-Algoritma ve Programlama II Uygulama -13

BULANIK MANTIK VE SİSTEMLERİ BAHAR DÖNEMİ ÖDEV 1. Müslüm ÖZTÜRK Bilişim Teknolojileri Mühendisliği ABD Doktora Programı

ile Python gibi kod yazma

BLM111 Programlama Dilleri I. Hafta 10 Diziler. Yrd. Doç. Dr. Caner ÖZCAN

Fen ve Mühendislik Uygulamalarında MATLAB

m=n şeklindeki matrislere kare matris adı verilir. şeklindeki matrislere ise sütun matrisi denir. şeklindeki A matrisi bir kare matristir.

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

Transkript:

AST415 Astronomide Sayısal Çözümleme - I 6. Diziler ve Matrisler (NumPy Modülü)

Bu derste neler öğreneceksiniz? Python da Nümerik Diziler (Array) Dizilere Neden İhtiyaç Var? Python ve Nümerik Diziler (NumPy Modülü) Nümerik Dizilerde İndeksleme ve Dilimleme İşlemleri - 1 Fonksiyonlardan Veri Toplamak Diziler Üzerinde Fonksiyonların Kullanımı (Vektörleştirme) Dizilerle İşlemler Dizi Kopyalama Dizilerle Hızlı İşlemler Nümerik Dizilerde İndeksler ve Dilimleme - 2 Dizilerde Tür (Type) Kontrolü - Isinstance Dizi Oluşturma Fonksiyonları (arange ve linspace) Python da Matrisler Numpy da Matrisler Matris Uygulamaları için Listeler ve Diziler - 1 Matrix Nesnesi ve Numpy'da Matris İşlemleri

Fonksiyonlardan Veri Toplamak İçin Listeleri Kullanmak Tanımlı bir f(x) fonksiyonumuz olsun ve bu fonksiyonu x 0, x 1, x 2, x n-1 şeklinde verilen n tane x değerine uygulamak istiyor olalım. Bütün x i bağımsız değişkenlerini bir listede, fonksiyondan dönecek değerlerle oluşacak y i = f(x i ) bağlı değişkenlerini ise başka bir listede toplayabiliriz. Aşağıda bu şekilde bir örnek görüyorsunuz >>> def f(x): return x**3 # ornek fonksiyon >>> n = 5 # nokta sayisi >>> dx = 1.0 / (n-1) # [0,1] araligindaki x'lerin arasindaki uzaklik >>> xlist = [i*dx for i in range(n)] >>> ylist = [f(x) for x in xlist] >>> xy_ikili = [[x,y] for x,y in zip(xlist,ylist)] >>> print xlist [0.0, 0.25, 0.5, 0.75, 1.0] >>> print ylist [0.0, 0.015625, 0.125, 0.421875, 1.0] >>> print xy_ikili [[0.0, 0.0], [0.25, 0.015625], [0.5, 0.125], [0.75, 0.421875], [1.0, 1.0]] Listeler oldukça kullanışlı olmakla birlikte özellikle matematiksel işlemler için dizileri (matrisleri) kullanmanın oldukça fazla avantajı (bir fonksiyonu tüm liste elemanlarına tek bir kerede uygulamak, işlemleri hızlı gerçekleştirmek, tüm dizinin aynı tür elemanlardan oluşmasının getirdiği avanatjlar vs.) vardır. Listeler özellikle farklı türden elemanları tutabilmeleri nedeniyle esnek, ancak biraz yavaştırlar ve daha çok kullanıcıdan girdi verisi alırken kullanılırlar.

Python'da Nümerik Diziler Python'da nümerik diziler liste elemanlarına benzemekle birlikte onlardan aşağıdaki özellikleri nedeniyle ayrılırlar. Dizinin tüm elemanları aynı türde olmalıdır. Bu tür nümerik işlemleri hızlı gerçekleştirmek ve sonuçlarını saklayabilmek açısından tam, reel, ya da kompleks sayı türlerinden biri olmalıdır. Dizi oluşturulmadan önce eleman sayısı bilinmelidir. Diziler standard Python dilinin bir parçası değil, NumPy modülünün bir parçasıdır. Dolayısı ile bu modül kurulmuş ve kullanılmadan önce import edilmiş olmalıdır. Numpy modülü matematiksel işlemlerin döngü yapılarına gerek kalmaksızın tüm bir dizi üzerinde uygulanmasını sağlar. Bu yapı vektörleştirme (ing. vectorization) olarak bilinir ve Python programlarının döngü yapıları kullanılarak kodlanan programlara oranla dramatik ölçüde farklı olmasını sağlar. Tek indeksli diziler vektörler, iki ya da daha fazla indeksli diziler ise matrsiler ya da tablolar olarak adlandırılırlar. >>> import numpy as np # numpy modulunun np lakabiyla import edilmesi >>> n = 101 # dizi elemani sayisi >>> r = range(n) # [0,100] arasindaki tam sayilari iceren bir liste 1 = np.array(r) # r listesinin bir numpy dizisine donusturulmesi 2 = np.zeros(n) # sadece 0 (sifir)'lardan olusan 101 elemanli dizi 3 = np.ones(n) # sadece 1 (bir)'lerden olusan 101 elemanli dizi >>> p = 1; q = 5; n = 5 # baslangic (p), son (q) ve elaman sayisi (n) 4 = np.linspace(p,q,n) # p ve q arasinda n tane eleman iceren dizi >>> print a4 [ 1., 2., 3., 4., 5.]

Nümerik Dizilerde İndeksler ve Dilimleme Python'da nümerik dizilerde indeksleme ve dilimleme bir çok önemli fark dışında listelerdekiyle aynı şekilde yapılır. Ancak dilimler orjinal dizinin bir kopyası olmayıp gerçekten bir bölümüdür. Dolayısı ile dilim üzerinde bir değişiklik yaptığınız vakit orjinal dizide de bu dilimin karşılık geldiği elemanlar değişir! >>> import numpy as np # numpy modulunun np lakabiyla import edilmesi = np.linspace(1,10,10) >>> print a[0],a[-1],a[5] 1.0, 10.0, 6.0 >>> print a[:5] [1., 2., 3., 4., 5.] >>> print a[7:] [8., 9., 10.] >>> print a[3:7] [4., 5., 6., 7.] >>> print a[0:-1:2] [1., 3., 5., 7., 9.] >>> print a[::4] [1., 5., 9.] [1:-1] array([ 2., 3., 4., 5., 6., 7., 8., 9.]) >>> b = a[1:-1] >>> b[2] = 0.1 >>> b array([ 2., 3., 0.1, 5., 6., 7., 8., 9. ]) array([ 1., 2., 3., 0.1, 5., 6., 7., 8., 9., 10. ])

Fonksiyonlardan Veri Toplamak İçin Nümerik Dizileri Kullanmak Tanımlı bir f(x) fonksiyonumuz olsun ve bu fonksiyonu x 0, x 1, x 2, x n-1 şeklinde verilen n tane x değerine uygulamak istiyor olalım. Bütün x i bağımsız değişkenlerini bu kez bir nümerik dizide (x2), fonksiyondan dönecek değerlerle oluşacak y i = f(x i ) bağlı değişkenlerini ise başka bir dizide (y2) toplayalım. Aşağıdaki örnekte bu dersin birinci örneğindeki gibi listeler yerine diziler kullanılmıştır. >>> def f(x): return x**3 # ornek fonksiyon >>> n = 5 # nokta sayisi >>> x2 = np.linspace(0,1,n) >>> y2 = np.zeros(n) >>> for i in xrange(n): # xrange range fonksiyonundan daha hizli calisir y2[i] = f(x2[i]) >>> y2 array([ 0., 0.015625, 0.125, 0.421875, 1. ]) >>> # y2 dizisini olusturmak icin alternatif kod >>> y2 = np.array([f(xi) for xi in x2]) array([ 0., 0.015625, 0.125, 0.421875, 1. ]) Listeler için döngü kullanmaksızın kısa oluşturma şekillerinin mümkün olduğunu (list comprehensions) daha önce görmüştük. Bu yapılar nümerik diziler için kullanılamazlar. Ancak her zaman bu yapıları kullanarak bir liste oluşturup onu nümerik diziye dönüştürmeniz mümkündür. Yukarıdaki örnekte y2 dizisi kullanılan döngüye alternatif olarak bu yapıyla oluşturulup sonradan diziye dönüştürülmüştür. Ancak dizilerin asıl gücü fonksiyonun kolayca tüm diziye uygulanabilmesinden (vektörleştirme) gelir! >>> y2 = f(x2) >>> y2 array([ 0., 0.015625, 0.125, 0.421875, 1. ])

Diziler Üzerinde Fonksiyonların Kullanımı (Vektörleştirme) Örneğin tanımlı f(x) fonksiyonunuz sin(x)*cos(x)*(e -x ) 2 + 2 + x 2 olsun ve bu fonksiyonu x 0, x 1, x 2, x n-1 şeklinde verilen n tane x değerine uygulamak istiyor olalım. x'in n tane eleman içeren bir nümerik dizi olarak tanımlanması durumunda aşağıdaki tek satırı yazmamız bu işlem için yeterlidir. >>> r = sin(x)*cos(x)*exp(-x)**2 + 2 + x**2 Aşağıdaki iki örnekte aynı fonksiyon x nümerik dizisi üzerine skaler (1) ve vektörel (2) olarak uygulanıyor. Hangisini kodlamanın daha kolay olduğu açıktır ve de vektörel örnek daha hızlı çalışır! (1) (2) >>> N = 5; x = np.zeros(n), y = np.zeros(n) >>> dx = 2.0 / (N-1) # araliklara ayirma >>> for i in range(n): x[i] = -1 + dx*i y[i] = exp(-x[i])*x[i] >>> N = 5 >>> x = np.linspace(0,2,n) >>> y = exp(-x)*x Bir f fonksiyonu, eğer x nümerik dizisinin tüm elemanları için f(x) şeklinde çalıştırılabiliyor ve sonucu y = f(x) nümerik dizisi oluyorsa bu fonksiyona vektörleştirilmiş fonksiyon denir. >>> def f(x): return x**4*np.exp(-x) >>> x = np.linspace(-3,3,101) >>> y = f(x)

Dizi Kopyalama x bir nümerik dizi olsun. a = x ifadesinin x isminin atıfta bulunduğu diziye a isminin de atıfta bulunması anlamına geldiğini bu nedenle x dizisinde yapılacak bir değişikliğin a dizisini de etkileyeceğini görmüştük (Slayt 5). Bunu yapabilmenin yolu x dizisinin bir kopyasını yaratıp, ismini a olarak belirlemektir. >>> import numpy as np >>> x = np.array([1, 2, 3.5]) = x [-1] = 3 array([1, 2, 3]) >>> x array([1, 2, 3]) # gordugunuz gibi x de degisti = x.copy() [-1] = 9 array([1, 2, 9]) >>> x array([1, 2, 3])

Dizilerle Hızlı İşlemler Konu nümerik diziler olunca, a ve b'nin her ikisinin de eşit uzunluklu birer nümerik dizi olması durumunda a += b yazımıyla a = a + b yazımı arasında ciddi bir fark oluşmaktadır. Zira a += b yazımı, a dizisinin her bir elemanını b dizisinde karşılık geldiği eleman kadar arttırırken, a = a + b yazımı, a dizisiyle b dizisini toplayıp ara bir nümerik dizi oluşturmakta ve bu dizinin adını a olarak değiştirmektedir. Söz konusu olan kısa iki liste olduğu zaman problem çok büyük sayılmaz. Ancak bilim ve mühendislik uygulamaları çoğu zaman çok sayıda ve oldukça fazla eleman içeren matrisler üzerinde işlem yapmaya dayandığından önemi bir hafıza ve hız problemiyle karşılaşma olasılığı ortaya çıkar. = (3*x**4 + 2*x + 4)/(x + 1) Ifadesinde sırasıyla; r1 = x**4, 2. r2 = 3*r1, r3 = 2*x, r4 = r2 + r3, r5 = r4 + 4, r6 = x + 1, r7 = r5/r6, a = r7 şeklinde 7 tane ara dizi oluşmaktadır. Oysa aşağıdaki ifadeler toplamda çirkin görünse de sadece üç yeni nümerik dizi (x'i kopyalama, 2 ile çarpma ve 1 ekleme sırasında oluşan) üzerinden yukarıdaki işlemi daha efektif bir şekilde gerçekleştirir. = x.copy() **= 4 *= 3 += 2*x += 4 /= x + 1 Dizi Oluşturma Üzerine 2 Faydalı İpucu NumPy'da nümerik dizi oluştururken zeros ve ones fonksiyonlarının yanı sıra copy fonksiyonu da sıkça kullanılır. zeros fonksiyonunu a = zeros(x.shape, x.dtype) şeklinde kullanmak a'nın x ile aynı yapıda ve aynı tür elemanlar içeren ama sadece 0'lardan oluşan bir dizi oluşturmanızı sağlar. a = asarray(a) yapısı ise a bir dizi ise hiçbir değişiklik yapmazken, a'nın bir liste ya da demet değişken (iterable) olması durumunda onu bir nümerik diziye çevirir.

Nümerik Dizilerde İndeksler ve Dilimleme - 2 Python'da nümerik dizilerde indeksleme ve dilimleme konusunda görmüştük (Slayt 5). Pratik faydalar sağlaması açısndan a[range(f:t:i)] yapsının kullanımına bakalım. Bu yapı a[f:t:i] yapısyla aynıdır ve a dizisinin f indeksinden başlayıp t indeksine kadar (t hariç), i adımlarla elemanlarını almamıza (istersek değiştirmemize) yarar. >>> import numpy as np = np.linspace(1,8,8) array([ 1., 2., 3., 4., 5., 6., 7., 8.]) [[1,6,7]] = 10 # 1., 6. ve 7. indekslerin değerini 10 yap array([ 1., 10., 3., 4., 5., 6., 10., 10.]) [range(2,8,3)] = -2 # range 2 ile 8 indeksler arasinda (8 haric) 3er atlayarak indeks degerlerini uretir array([ 1., 10., -2., 4., 5., -2., 10., 10.]) Daha da pratik ve oldukça kullanışlı bir indeksleme türü de boolean ifadelere dayanır. Aşağıda verilen örneklerde göreceğiniz gibi boolean ifadeler de indeksleme için kullanılabilir. [a < 0] # Negatif degerlerden bir dilim olustur array([-2., -2.]) [a < 0] = a.max() # negatif elemanlari a dizisinin maksimumu degeri yap array([ 1., 10., 10., 4., 5., 10., 10., 10.]) [[1,6,7]] = 10 # 1., 6. ve 7. indekslerin değerini 10 yap # a'daki 10lari verilen baska bir diziden sirayla secilen elemanlarla degistir [a == 10] = [10, 20, 30, 40, 50, 60, 70] rray([ 1., 10., 20., 4., 5., 30., 40., 50.])

Tür (type) Kontrolü isinstance NumPy nümerik dizilerinin türü ndarray 'dir. = linspace(-1, 1, 3) array([-1., 0., 1.]) >>> type(a) <type numpy.ndarray > Bazen kodunuzun içinde bir değişkenin türünü kontrol etmek ve değişkenin türüne göre değişen işlemler yapmanız gerekebilir. Bir değişkenin türünü kontrol etmek için isinstance fonksiyonu kullanılır. = linspace(-1, 1, 3) >>> isinstance(a, ndarray) True >>> type(a) == ndarray True >>> isinstance(a, (float, int)) # a float ya da int turu mu? False Aşağıda gelen değişkenin türüne göre farklı bir işlem yapan, istenen türlerden birinde değişken gelmiyorsa tür hatası (TypeError) veren bir örnek fonksiyon görüyorsunuz (tur_kontrolu.py). def f(x): if isinstance(x, (float, int)): return 2 elif isinstance(x, ndarray): return zeros(x.shape, x.dtype) + 2 else: raise TypeError\ ("x int, float ya da ndarray, turleriden biri olmali %s degil" % type(x)

Eş Aralıklarla Dizi Oluşturmak: arange ve linspace Eşit aralıklarla sıralanmış sayılarla NumPy nümerik dizisi oluşturmanın bir yolu arange fonksiyonunu kullanmaktır. arange fonksiyonu tıpkı range ve xrange fonksiyonları gibi çalışır. Farkı sonucun bir liste olması yerine bir NumPy nümerik dizisi olması ve reel sayıları da içerebilmesidir. = arange(-1.,1.,0.5) array([-1., -0.5, 0., 0.5]) NumPy modülünde arange fonksiyonu ve linspace fonksiyonuna özdeş ancak oldukça kompakt bir yazım daha bulunmaktadır: r_[f:t:s] = r_[-5:5:11j] # linspace(-5, 5, 11) yazimina ozdes >>> print a [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] = r_[-5:5:1.0] # arange(-5.,5.,1.) yazimina ozdes >>> print a [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4.]

NumPy 'da Matrisler Bir NumPy nümerik dizisinin boyutunu shape metodunu kullanarak öğerenebilirsiniz. Bu dizi metodu bir NumPy dizisinin her bir boyutunun uzunluğunu tutar, çıktısı her bir boyutun uzunluğunu veren bir demettir (tuple). Aynı metod dizinin boyutunu değiştirmek için de kullanılabilir. = linspace(-1, 1, 6) array([-1., -0.6, -0.2, 0.2, 0.6, 1. ]).shape (6,).size 6.shape = (2,3) array([[-1., -0.6, -0.2], [ 0.2, 0.6, 1. ]]) = a.reshape(3,2) # shape alternatifi olarak reshape kullanilabilir array([[-1., -0.6], [-0.2, 0.2], [ 0.6, 1. ]]) >>> len(a) 3 Bir NumPy dizisi gördüğünüz gibi bir matris saklamak ve NumPy fonksiyonlarının kullanımı ile matris işlemleri yapmak için ideal bir araçtır.

Matris Uygulamaları için Listeler vs. Diziler - 1 Python dizileri kullanarak da matrisleri saklayabilirsiniz. Üzerinde (özellikle ileri matris işlemleri gibi) işlem yapmak oldukça zor olsa da bu mümkündür. >>> Cderece = [-30 + i*10 for i in range(3)] >>> Fderece = [9./5*C + 32 for C in Cderece] >>> tablo1 = [[C, F] for C, F in zip(cderece, Fderece)] >>> print tablo1 [[-30, -22.0], [-20, -4.0], [-10, 14.0]] # 2x3 tablo Bu listeyi bir NumPy dizisine çevirmek oldukça kolaydır ve array fonksiyonu ile yapılır. >>> tablo2 = numpy.array(tablo1) >>> print tablo2 [[-30. -22.] [-20. -4.] [-10. 14.]] >>> type(tablo2) <type numpy.ndarray > Örneğimizdeki tablo1 ve tablo2 hafızada oldukça farklı şekillerde tutulur. Biri standart bir liste iken diğeri bir NumPy dizisidir. Bir liste olan tablo1 'in 3 elemanı vardır. Her bir eleman iki elemanı olan birer liste nesnesidir ve bu iki eleman da birer reel sayı (float) nesnesidir. Bir NumPy dizisi olan tablo2 ise hafızada 6 adet reel sayıdan oluşan tek bir dizidir. Dolayısı ile tablo1 hafızada farklı tür nesnelerden oluşan dağınık bir nesneye, tablo2 ise tek bir dizi nesnesine karşılık gelir. Bu nedenle (ve işlem fonksiyonelliği gibi başka nedenlerle!) matris işlemleri için NumPy dizilerini kullanmak listelerden daha avantajlı ve çok daha hızlıdır!

Matris Uygulamaları için Listeler vs. Diziler - 2 Buna karşılık liste ve dizi indekslemeleri daha önce gördüğünüz gibi benzer şekildedir. >>> tablo1[1][0] -20 >>> tablo2[1][0] -20.0 >>> tablo2[1,0] # daha cok kullanilan bir dizi indekslemesi -20.0 >>> tablo2.shape (3,2) # 3 satir 2 sutundan olusan bir NumPy dizisi İki boyutlu bir NumPy dizisinin elemanlarını tek tek yazdırmanın (ya da başka bir şekilde işlemenin) yolu içiçe iki for döngüsü kullanmaktır. >>> for i in range(tablo2.shape[0]): for j in range(tablo2.shape[1]): print tablo2[%d,%d] = %g % (i, j, tablo2[i,j]) tablo2[0,0] = -30 tablo2[0,1] = -22 tablo2[1,0] = -20 tablo2[1,1] = -4 tablo2[2,0] = -10 tablo2[2,1] = 14

Matris Uygulamaları için Listeler vs. Diziler - 3 Listelerin elemanlarına ulaşmak için dilimleme yöntemini kullandığımız gibi dizilerin alt dizilerine (satır ve sütun) ulaşmak için de dilimlemeyi aynı şekilde kullanabiliriz. >>> tablo2[0:tablo2.shape[0], 1] # 2. sutun (indeks = 1), tum satirlar array([-22., -4., 14.]) >>> tablo2[0:, 1] # 2. sutun, tum satirlar, alternatif 1 array([-22., -4., 14.]) >>> tablo2[:, 1] # 2. sutun, tum satirlar, alternatif 2 array([-22., -4., 14.]) Daha komplike bir örneğe daha büyük bir NumPy dizisi üzerinde bakalım. >>> t = linspace(1, 30, 30).reshape(5, 6) >>> t array([[ 1., 2., 3., 4., 5., 6.], [ 7., 8., 9., 10., 11., 12.], [ 13., 14., 15., 16., 17., 18.], [ 19., 20., 21., 22., 23., 24.], [ 25., 26., 27., 28., 29., 30.]]) >>> t[1:-1:2, 2:] # 2. satirdan (ind:1) sonuncuya (ind:-1) kadar birer # atlayarak ve 3. sutundan (ind:2) son sutuna kadar al array([ 9., 10., 11., 12.], [ 21., 22., 23., 24.]) >>> t[:-2, :-1:2] # sondan ikinci satira kadar tum satirlar # bastan son sutuna kadar birrer atlayarak sutunlar array([ 1., 3., 5.], [ 7., 9., 11.], [ 13., 15., 17.],)

Matrix Nesnesi ve NumPy'da Matris İşlemleri NumPy'da matris işlemlerini kolay ve hızlı yapabilmek üzere bir matris (matrix) nesnesi tanımlanmıştır. Bu nesne matris işlemlerini kolaylaştıran bazı özel metotlara da sahiptir. >>> x1 = numpy.array([1,2,3], float) >>> x2 = numpy. matrix(x1) # ya da numpy.mat(x1) >>> x2 matrix([[ 1., 2., 3.]]) >>> x3 = numpy.matrix(x1).transpose() # transpoze et >>> x3 matrix([[ 1.], [ 2.], [ 3.]]) >>> type(x3) <class numpy.core.defmatrix.matrix > >>> isinstance(x3, matrix) True >>> A = numpy.eye(3) # 3x3 bir birim matris dizisi --> I3 >>> A array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>> A = numpy.mat(a) >>> A matrix([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>> x2*a # 1x3 ve 3x3 iki matrisin carpimi --> 1x3 matris matrix([[ 1., 2., 3.]]) >>> A*x3 # 3x3 ve 3x1 iki matrisin carpimi --> 3x1 matris matrix([[ 1.], [ 2.], [ 3.]])

! Uyarı: NumPy dizileriyle matris çarpımı NumPy matris (matrix) nesneleriyle matris çarpımından farklıdır! >>> x1 = numpy.array([1,2,3], float) >>> A = numpy.mat(numpy.eye(3)) >>> type(x1) <type 'numpy.ndarray'> >>> type(a) <class 'numpy.matrixlib.defmatrix.matrix'> >>> A * x1 # Bir matrisle bir diziyi carpamazsınız Traceback (most recent call last):... ValueError: matrices are not aligned >>> # bir dizi ile digerini carpmayi deneyelim >>> A = (numpy.zeros(9) + 1).reshape(3,3) >>> A array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> A*x1 # [A[0,:]*x1, A[1,:]*x1, A[2,:]*x1] Matris carpimi degil! array([[ 1., 2., 3.], [ 1., 2., 3.], [ 1., 2., 3.]]) >>> B = A+1 >>> A*B # A'nin her bir elemani B'nin ayni indeksteki elamaniyla carpiliyor! array([[ 2., 2., 2.], [ 2., 2., 2.], [ 2., 2., 2.]]) >>> A = numpy.mat(a); B = numpy.mat(b) >>> A*B # Gercek matris carpimi! matrix([[ 6., 6., 6.], [ 6., 6., 6.], [ 6., 6., 6.]])

Ödev 7 (16 Aralık 2016, Cuma 16:00) Aşağıdaki işlemleri yapan birer Python programi yaziniz ve parantez içinde verilen isimlerle kaydedip, Ekrem Murat Esmer'e (esmer@ankara.edu.tr) e-posta ile gönderiniz. 1. Güneş-ikizi bir yıldızın (M * = 1 M Güneş ) 0.2 ile 1.6 AB arasında (1.6 dahil!) değişen uzaklıklarda dolaşması muhtemel ötegezegenlerin dönemlerini hesaplamak üzere i) 0.1 AB aralıkla artan bir uzaklik listesi oluşturup, bu listedeki her bir eleman için yörünge dönemini yıl cinsinden hesaplayınız. Bulduğunuz her dönem değerini donem listesine kaydettikten sonra uzaklik ve donem listelerini ekrana getiriniz (ad_soyad_ogrno_odev8a_liste.py). ii) NumPy zeros fonksiyonunu kullanarak bir önceki sorudaki uzaklik listesiyle aynı uzunlukta bir uzaklik nümerik dizisi ve bu diziyle aynı uzunlukta bir donem dizisi oluşturunuz. Bir for döngüsü içerisinde bu iki diziyi sırasıyla 0.1 AB aralıklarla 0.2-1.6 AB (1.6 dahil!) arası uzaklıklar ve bu uzaklıklara karşılık gelen yörünge dönemi değerleriyle doldurunuz. Oluşan iki diziyi ekrana yazdiriniz (ad_soyad_ogrno_odev8a_dizi.py). iii) NumPy linspace fonksiyonunu kullanarak 0.2-1.6 AB (1.6 dahil!) arası uzaklıkları içeren uzaklik nümerik dizisi oluşturunuz. Bu diziye Kepler in 3. yasasının basitleştirilmiş formülünü uygulayarak tek bir seferde (döngü kullanmadan) yörünge dönemlerini hesaplayıp donem dizisine yazdırınız. Oluşan her iki diziyi ekrana yazdırınız. (ad_soyad_ogrno_odev8a_vektor.py) 2.NumPy arange fonksiyonunu kullanarak 5 ile 10 arasında [5., 5.2, 5.4,, 10] şeklinde bir nümerik dizi oluşturunuz. Bu nümerik dizinin i) tamamını, ii) 4. elemanından sonraki tüm elemanlarını, iii) 20. elemanına kadar tüm elemanlarını, iv) 8 ile 16. elemanların arasındaki tüm elemanlarını, v) birer eleman atlayarak tüm elemanlarnı ([5., 5.4, 5.8, ]), vi) bu dizinin 6'dan büyük tüm elemanlarını, vii) bu dizinin 8'den küçük tüm elemanlarını, viii) bu dizinin 6 ile 8 arasındaki (6 ve 8 dahil) tüm elemanlarını ekrana uygun dilimlemeler (slicing) kullanarak yazdırınız.