6.16. Eğriler ve integral alma

Matematik sayfaları, bir dizi alıp bir dizi (veya skaler) üreten işlemleri ele aldı – aritmetik, indirgemeler, yayınlama. Bu sayfa farklı bir işlem sınıfını kapsar: diziyi örneklenmiş bir işlev olarak ele alıp işlevin kendisi hakkında sorular soran işlemler. Örnekler arasında ara değer bulma, onlara bir eğri uydurma, altlarındaki alanın integralini alma, başka bir arabellekle evrişimini alma.

Bunların hepsi ndarray girdileri kabul eder ve ya bir float skaler ya da bir float ndarray döndürür.

6.16.1. Ara değer bulma (interpolasyon)

interp(), tek boyutlu doğrusal ara değer bulma yapar. xp, bağımsız değerlerden oluşan tekdüze artan 1 boyutlu bir dizidir; fp eşleşen bağımlı değerlerdir; x ise ara değer fonksiyonunun değerlendirileceği yerdir:

xp = np.array([0.0, 1.0, 2.0, 3.0])
fp = np.array([10.0, 20.0, 25.0, 30.0])
x  = np.array([0.5, 1.5, 2.5])

np.interp(x, xp, fp)
# array([15.0, 22.5, 27.5])

[xp[0], xp[-1]] aralığının dışında sonuç sırasıyla fp[0] ve fp[-1] değerlerine kırpılır; left= ve right= anahtar sözcükleri bu uç noktaları geçersiz kılar.

Kamerada, bir kalibrasyon tablosunu rastgele örnek konumlarına yeniden eşlemek için kullanılır – bir termistörden gelen sıcaklık-gerilim tablosu, doğrusal olmayan bir piksel tepki eğrisi, kanal başına bir gama araması. Tek bir kütüphane çağrısı, girdiler üzerinde tek bir geçiş, Python döngüsü yok.

6.16.2. Polinom uydurma ve değerlendirme

polyfit(), deg derecesinden bir polinomu en küçük kareler yöntemiyle (x, y) veri noktalarına uydurur ve katsayıları (en yüksek derece önce) döndürür:

x = np.array([0.0, 1.0, 2.0, 3.0, 4.0])
y = np.array([0.0, 1.1, 3.9, 9.1, 15.8])

coeffs = np.polyfit(x, y, 2)
# array([1.0, 0.0, 0.0])  (approximately)

x atlandığında range(len(y)) kullanılır – ilişkili bir x ekseni olmayan, düzenli aralıklarla örneklenmiş bir arabelleğe hızlı bir polinom uydurmak için kullanışlıdır:

np.polyfit(y, 2)

polyval(), katsayıları p olan polinomu x noktasında değerlendirir. Girdi x bir skaler (bir float döndürür) veya bir ndarray (bir ndarray döndürür) olabilir:

p = np.polyfit(x, y, 2)
fitted = np.polyval(p, x)

Doğal eşleşme, kalibrasyon zamanında polyfit işlevini bir kez çağırmak, katsayıları saklamak ve ortaya çıkan eğriyi her çerçevede değerlendirmek için polyval işlevini çağırmaktır. Polinom değerlendirme adımı, örnek başına bir avuç float işlemidir; bu da en küçük kameralarda bile ucuzdur.

6.16.3. Evrişim

convolve(), iki 1 boyutlu dizinin tam uzunluklu ayrık doğrusal evrişimini döndürür. Yalnızca full modu uygulanmıştır; çıktı uzunluğu len(a) + len(v) - 1 şeklindedir. Masaüstü numpy tarafından sunulan same ve valid modlarıyla aynı etkiyi elde etmek için sonucu dilimleyin:

a = np.array([1.0, 2.0, 3.0])
v = np.array([0.5, 0.5])

np.convolve(a, v)
# array([0.5, 1.5, 2.5, 1.5])

Bir SOS zinciri kurmanın aşırıya kaçtığı kısa FIR filtreleri ve yumuşatma çekirdekleri (kutu, üçgen, gauss) için kullanışlıdır. Çalışma süresi iki dizi uzunluğunun çarpımıyla orantılıdır – kısa çekirdekler için uygundur, ancak uzun olanlar için hızla bir FFT evrişiminden daha pahalı hale gelir.

6.16.4. Yamuk (trapez) integrasyonu

trapz(), örneklenmiş bir işlevin integralini bileşik yamuk kuralıyla alır:

x = np.linspace(0, np.pi, num=128)
y = np.sin(x)
np.trapz(y, x)             # ~ 2.0

Örnek aralığı tekdüze olduğunda ve yalnızca adım önemli olduğunda dx= geçin; örnekler eşit aralıklı olmadığında x= geçin. Analitik biçimin mevcut olmadığı, halihazırda yakalanmış sensör verilerinin integralini almak için doğru çağrıdır.

Bant sınırlı hale getirilmiş örnek verileri için (örneğin örtüşme önleyici bir filtreden sonra bir ses arabelleği), yamuk kuralı örnek sayısının karesiyle yakınsar; bu da arabellek uzunluğunu iki katına çıkarmanın hatayı dört kat azalttığı anlamına gelir.

İntegrali alınan ifade bir örnek arabelleği değil de uygulamanın rastgele noktalarda değerlendirebileceği bir Python işlevi olduğunda, farklı bir çözücü ailesi doğru çağrıdır.