İÇERİK

  1. SciPy ile Çalışma√
  2. Başlarken
  3. SciPy Organizasyonu
  4. Temel Fonksiyonlar√
    1. NumPy ile Etkileşim√
      1. Dizin Hileleri√
      2. Şekil Manipulasyonu√
      3. Polinomlar√
      4. Vektörleştirme Fonksiyonları√
      5. Tip İşleme√
      6. Diğer Yararlı Fonksiyonlar√
  5. Özel Fonksiyonlar (scipy.special)
  6. İntegralleme (scipy.integrate)
  7. Optimizasyon (scipy.optimize)
  8. İnterpolasyon (scipy.interpolate)
  9. Fourier Dönüşümleri (scipy.fftpack)
  10. Sinyal İşleme (scipy.signal)
  11. Lineer Cebir (scipy.linalg)
  12. ARPACK ile Seyrek Özdeğer Problemleri(scipy.sparse.csgraph)
  13. Sıkıştırılmış Seyrek Grafik Rutinleri (scipy.sparse.csgraph)
  14. Mekansal veri yapıları ve algoritmaları (scipy.spatial)
  15. İstatistikler (scipy.stats)
  16. Çok boyutlu görüntü işleme (scipy.ndimage)
  17. Dosya G / Ç (scipy.io)

SciPy ile çalışma

Python bir programlama dalıdır ve ona yaklaşmanın çeşitli yolları vardır. Başlayabileceğiniz ve entegre bir kullanıcı deneyimi sağlayan tek bir program yok. Bunun yerine, Python ile çalışmanın çeşitli olası yolları vardır.

En yaygın olanı komutları girmek ve komut dosyalarını çalıştırmak için gelişmiş etkileşimli Python kabuğu IPython’u kullanmaktır. Komut dosyaları herhangi bir metin editörü, örneğin Emacs, Vim veya Not Defteri ile yazılabilir. SciPy Stack Kurulumunda bahsedilen Python (x, y) gibi paketlerin bir kısmı da entegre bir bilimsel geliştirme ortamı sunmaktadır.

Ne SciPy ne NumPy çizim işlevleri sunmaz. Python için birkaç çizim paketi vardır, bunlar arasında en yaygın kullanılan matplotlib’dir.

Başlarken

SciPy, Python’un Numpy uzantısına dayanan matematiksel algoritmalar ve kolaylık işlevlerinin bir koleksiyonudur. Kullanıcıya veriyi manipüle etmek ve görselleştirmek için üst düzey komutlar ve sınıflar sunarak etkileşimli Python oturumuna önemli güç katar. SciPy ile etkileşimli bir Python oturumu, MATLAB, IDL, Octave, R-Lab ve SciLab gibi sistemler ile yarışan veri işleme ve sistem prototipleme ortamına dönüşür.

SciPy’yi Python’a dayandırmanın ilave yararı, gelişmiş programların ve özelleştirilmiş uygulamaların geliştirilmesinde kullanılabilecek güçlü bir programlama dili olmasını sağlamasıdır. SciPy’yi kullanan bilimsel uygulamalar, geliştiriciler tarafından yazılım dünyasında sayısız modülde ek modüllerin geliştirilmesinden yararlanmaktadır. Paralel programlamadan web’e ve veri tabanı altprogramlarına ve sınıflarına kadar olan her şey Python programcısına sunulmuştur. Bütün bu güç, SciPy’deki matematik kütüphanelerine ek olarak mevcuttur.

Kısalık ve kolaylık sağlamak için, ana paketlerin (numpy, scipy ve matplotlib) şu şekilde import edildiğini varsayacağız:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

Bunlar topluluğumuzun halka açık posta listelerinde tartıştıktan sonra kabul ettiği import gelenekleridir. NumPy ve SciPy kaynak kodu ve belgeleri boyunca bu gelenekleri görürsünüz. Tabii ki bu gelenekleri kendi kodunuzda izlemenizi gerektirmese de kesinlikle önerilir.

SciPy Organizasyonu

SciPy, farklı bilimsel hesaplama alanlarını kapsayan alt paketler halinde organize edilmiştir. Bunlar aşağıdaki tabloda özetlenmiştir:

Subpackage Description
cluster Clustering algorithms
constants Physical and mathematical constants
fftpack Fast Fourier Transform routines
integrate Integration and ordinary differential equation solvers
interpolate Interpolation and smoothing splines
io Input and Output
linalg Linear algebra
ndimage N-dimensional image processing
odr Orthogonal distance regression
optimize Optimization and root-finding routines
signal Signal processing
sparse Sparse matrices and associated routines
spatial Spatial data structures and algorithms
special Special functions
stats Statistical distributions and functions

Temel Fonksiyonlar

NumPy ile Etkileşim

Scipy, Numpy üzerine kurulur ve tüm temel dizi işlemleri için Numpy işlevlerini kullanabilirsiniz:

import numpy as np
np.some_function()

Bu öğreticilerin her biri için ayrıntılı bir açıklama vermek yerine (Numpy Başvuru Kılavuzunda veya help, info ve source komutlarını kullanarak) ayrıntılı bir açıklama vermek yerine, bu eğitimde aşağıdakilere yönelik küçük bir tanıtım gerektiren daha kullanışlı komutların bazıları ele alınacaktır. Bazı Scipy modüllerinin işlevlerini kullanmak için şunları yapabilirsiniz:

from scipy import some_module
some_module.some_function()

Scipy’nin üst düzeyinde ayrıca numpy ve numpy.lib.scimath fonksiyonları bulunur. Bununla birlikte, doğrudan numpy modülünden kullanmak daha iyidir.

Dizin Hileleri

Dizi oluşturma için etkili araçlar sağlamak için dilimleme işlevselliğini özel olarak kullanan bazı sınıf örnekleri vardır. Bu bölüm, dizileri hızla oluşturmak için np.mgrid, np.ogrid, np.r_ ve np.c_ işlemlerini tartışacaktır.

Örneğin, aşağıdakine benzer bir şey yazmak yerine

a = np.concatenate(([3], [0]*5, np.arange(-1, 1.002, 2/9.0)))

r_ komutu ile bunu aşağıdakilerden biri olarak girebilirsiniz:

a = np.r_[3,[0]*5,-1:1:10j]

Yazmayı kolaylaştırabilir ve daha okunabilir kodlar oluşturabilir. Nesnelerin nasıl birleştirildiğine dikkat edin ve dilimleme sözdizimi aralıkları oluşturmak için kullanılır. Küçük bir açıklama hak eden diğer terim, dilimleme sözdiziminde basamak boyutu olarak karmaşık sayı 10j’yi kullanmaktır. Bu standart dışı kullanım, sayının bir basamak boyutu yerine aralıkta üretilecek puan sayısı olarak yorumlanmasını sağlar (biz, 10 L uzunluktaki tamsayı gösterimi kullandığımıza dikkat edin, ancak bu gösterim Python’da Tam sayılar birleşik hale gelir). Bu standart dışı kullanım bazılarına karşı gösterişsiz olabilir ancak kullanıcıya karmaşık vektörleri çok okunabilir bir şekilde hızlı bir şekilde inşa etme olanağı verir. Noktaların sayısı bu şekilde belirtildiğinde, bitiş noktası kapsayıcıdır.

Virgül arasındaki nesneler 2 boyutlu diziler ise, satırlarla yığılmış (dolayısıyla bunlara denk düşen sütunlar olmalı) “r” satır birleştirilmesi anlamına gelir. 2d dizilerini sütunlarla yığar, ancak 1d diziler için r_ ile aynı şekilde çalışan eşdeğer bir komut c_ vardır.

Genişletilmiş dilimleme gösterimini kullanan diğer bir çok yararlı sınıf örneği, mgrid işlevidir. En basit durumda, bu işlev arange için uygun bir ikame olarak 1d aralıkları oluşturmak için kullanılabilir. Ayrıca, karmaşık sayıların basamak boyutunda kullanılmasına izin vererek (son nokta dahil) uç noktalar arasında yer alacak noktaların sayısını belirtebilirsiniz. Bununla birlikte, bu işlevin gerçek amacı, N-boyutlu hacim için koordinat dizileri sağlayan N, N-d dizileri üretmektir. Bunu anlamanın en kolay yolu kullanım örneğidir:

print np.mgrid[0:5,0:5]
print np.mgrid[0:5:4j,0:5:4j]

Çıktısı:

array([[[0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1],
        [2, 2, 2, 2, 2],
        [3, 3, 3, 3, 3],
        [4, 4, 4, 4, 4]],
       [[0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4]]])
array([[[ 0.    ,  0.    ,  0.    ,  0.    ],
        [ 1.6667,  1.6667,  1.6667,  1.6667],
        [ 3.3333,  3.3333,  3.3333,  3.3333],
        [ 5.    ,  5.    ,  5.    ,  5.    ]],
       [[ 0.    ,  1.6667,  3.3333,  5.    ],
        [ 0.    ,  1.6667,  3.3333,  5.    ],
        [ 0.    ,  1.6667,  3.3333,  5.    ],
        [ 0.    ,  1.6667,  3.3333,  5.    ]]])

Bu gibi sıraları birleştirmek  bazen çok yararlıdır. Bununla birlikte, Numpy ve SciPy’nin dizi yayın kuralları nedeniyle bir grid üzerinde bazı N-boyutlu fonksiyonların değerlendirilmesi her zaman gerekli değildir. Eğer bir meshgrid üretmek için tek amaç buysa bunun yerine newaxis’i kullanarak N, Nd dizileri yaratmak için her dizideki bir boyutun 1’den büyük olduğu bir “açık” grid oluşturan ogrid işlevini kullanmalısınız. Meshgrid’in tek amacı, bir Nd fonksiyonunun değerlendirilmesi için örnek noktalar üretmek ise, aynı sonucu yaratın.

Şekil Manipulasyonu

Bu kategorideki işlevler, N boyutlu dizilerden uzunlukları sıkıştırmak, dizinin en az 1, 2 veya 3 boyutlu olmasını sağlamak ve dizileri satırlar, sütunlar ve sıralarla yığınlamak (birleştiren) sağlamak için kullanılan yordamlardır. “Sayfalar” (üçüncü boyutta). Bölmeleri ayırmak için (kabaca yığın dizilerinin tam tersi) şablonlar da mevcuttur.

Polinomlar

SciPy’de 1-d polinomlarıyla başa çıkmak için iki tane (değiştirilebilir) yol vardır. Birincisi, Numpy’nin poli1d sınıfını kullanmaktır. Bu sınıf, bir polinomu başlatmak için katsayıları veya polinom köklerini kabul eder. Polinom nesnesi cebirsel ifadelerde manipüle edilebilir, entegre edilebilir, farklılaşabilir ve değerlendirilebilir. Bir polinom gibi yazdırıyor bile:

from numpy import poly1d
p = poly1d([3,4,5])
print p
print p*p
print p.integ(k=6)
print p.deriv()
print p([4, 5])

Çıktısı:

   2
3 x + 4 x + 5
   4      3      2
9 x + 24 x + 46 x + 40 x + 25
   3     2
1 x + 2 x + 5 x + 6
6 x + 4
array([ 69, 100])

Polinomları ele almanın diğer bir yolu, dizinin birinci elemanı ile en yüksek katsayı veren katsayı dizisidir. Katsayı dizileri olarak temsil edilen polinomları eklemek, çıkartmak, çarpmak, bölmek, bütünleştirmek, ayırmak ve değerlendirmek için açık işlevler vardır.

Vektörleştirme Fonksiyonları

NumPy’nin sağladığı özelliklerden birisi, diğer Numpy fonksiyonarıyla (yani Evrensel işlevler veya ufuncs) aynı yayın kurallarıyla skalerleri kabul eden ve skalerleri “vektörize edilmiş bir fonksiyona “dönüştüren sıradan bir Python fonksiyonunu dönüştürmek için bir sınıf vektörize eder. Örneğin, addedubtract adında bir Python işlevine sahip olduğunuzu varsayalım:

def addsubtract(a,b):
    if a > b:
        return a - b
    else:
        return a + b

İki skalalı değişkenin bir fonksiyonunu tanımlar ve skaler bir sonuç verir. Sınıf vektörize bu işlevi “vectorize” yapmak için kullanılabilir;

vec_addsubtract = np.vectorize(addsubtract)

Dizi bağımsız değişkenlerini alan ve bir dizi sonucu döndüren bir işlevi döndürür:

print vec_addsubtract([0,3,6,9],[1,3,5,7])

Çıktısı:

array([1, 6, 1, 2])

Bu özel fonksiyon  vectorize kullanılmadan vektör formunda yazılmış olabilir. Ancak, yazdığınız işlev bazı optimizasyon veya entegrasyon rutininin sonucu ise? Bu gibi işlevler büyük olasılıkla yalnızca vectorize kullanılarak vektörize edilebilir.

Tip İşleme

Np.iscomplex / np.isreal ve np.iscomplexobj / np.isrealobj arasındaki farkı not edin. Eski komut dizi tabanlı olup, element-wise testin sonucunu sağlayan ve bir ve sıfır bayt dizilerini döndürür. İkinci komut nesne tabanlıdır ve testin sonucunu tüm cisim üzerinde tanımlayan bir skala döndürür.

Genellikle karmaşık bir sayının yalnızca gerçek ve / veya hayali bölümünü alması gerekir. Karmaşık sayılar ve diziler, bu değerleri döndüren özniteliklere sahipken, nesne karmaşık değerli olup olmayacağından emin değilse, np.real ve np.imag işlevsel formlarını kullanmak daha iyidir. Bu işlevler, Numpy dizisine dönüştürülebilecek herhangi bir şey için başarılı olur. Ayrıca, küçük sanal parça ile kompleks değerli bir sayıya gerçek bir sayıya dönüşen np.real_if_close işlevini de düşünün.

Bazen, bir sayının bir sayaç (Python (long) int, Python float, Python kompleksi veya aralık-0 dizisi) olup olmadığını kontrol etme ihtiyacı kodlamada ortaya çıkar. Bu işlevsellik, 1 veya 0 değerini döndüren np.isscalar işlevinde sağlanır.

Son olarak, nesnelerin belirli bir Numpy türü olmasını sağlamak, SciPy’de np.cast sözlüğünün kullanımı ile uygun bir arabirim verildiğinden yeterince sık oluşur. Sözlük, dökümünü yapmak istediği türe göre değişir ve sözlük, çevirme işlemini gerçekleştirmek için kullanılan işlevleri saklar. Böylece, np.cast [‘f’] (d) n’den bir dizi np.float32 döndürür. Bu işlev aynı zamanda belirli bir türdeki bir skalanın elde edilmesinin kolay bir yolu olarak da yararlıdır:

print np.cast['f'](np.pi)
 Çıktısı:
array(3.1415927410125732, dtype=float32)

Diğer Yararlı Fonksiyonlar

Ayrıca belirtilmesi gereken diğer faydalı fonksiyonlar da vardır. Faz işleme için, angle ve unwrap fonksiyonları yararlıdır. Ayrıca, linspace ve logspace fonksiyonları eşit aralıklı örnekleri lineer veya log ölçeğinde döndürür. Son olarak, Numpy’nin endeksleme yeteneklerinin farkında olmak kullanışlıdır. Birden fazla koşulun ve çoklu seçimin yer alacağı işlevselliği genişleten fonksiyon select e değinilmelidir. Arama kuralı select(condlist, choicelist, default = 0). select, birden fazla if ifadesinin vektörize edilmiş bir formudur. Bir koşullar listesine dayanarak bir dizi sonuç döndüren bir fonksiyonun hızla yapılandırılmasına olanak tanır. Dönüş dizisinin her bir öğesi, koşul listesindeki ilk koşula uygun doğru seçicide diziden alınır. Örneğin

x = np.r_[-2:3]
print x
print np.select([x > 3, x >= 0], [0, x+2])

Çıktısı:

array([-2, -1,  0,  1,  2])
array([0, 0, 2, 3, 4])

 

scipy.misc modülünde bazı ek faydalı fonksiyonlar da bulunabilir. Örneğin factorial ve comb fonksiyonları n! N! Ve n! / K! (N-k)! N! / K! (N-k)! , (Python’ın Long tamsayı nesnesi sayesinde) kullanarak veya kayan nokta hassasiyetini ve gama işlevini kullanarak hesaplayabilir . Başka bir fonksiyon, görüntü işleme sürecinde kullanılan ortak bir görüntüyü döndürür: lena.

Son olarak, bağımsız farklar kullanarak fonksiyonların türevlerini yaklaştırmada kullanışlı iki fonksiyon sağlanmıştır. central_diff_weights fonksiyonu, o sırasının türevine eşit aralıklı NN-noktası yaklaşımı için ağırlıklandırma katsayılarını döndürür. Bu ağırlıklar, bu noktalara karşılık gelen fonksiyonla çarpılmalı ve türev yaklaştırmayı elde etmek için sonuçlar eklenmelidir. Bu fonksiyon, yalnızca fonksiyonun örnekleri olduğunda kullanılabilir. Fonksiyonu bir şablona aktarılabilen ve değerlendirilebilen bir nesne olduğunda, derivative, belirli bir noktadaki o-türevine N-nokta yaklaşımı elde etmek için nesneyi doğru noktalarda otomatik olarak değerlendirmek için kullanılabilir.

Referans: https://docs.scipy.org/doc/scipy/reference/tutorial/index.html