2013-09-06 10 views
20

Temel 2-D numpy dizilerim var ve onları daha kaba bir çözünürlüğe "örneklemek" istiyorum. Bunu kolayca yapabilecek basit bir numpy veya scipy modülü var mı? Ayrıca bu dizinin coğrafi olarak Basemap modülleriyle görüntülendiğini de belirtmeliyim.Python'daki downsample dizisi

NUMUNE: enter image description here

cevap

3

imresize ve benzeri ndimage.interpolation.zoom göz onlar

Burada imresize önce denedim ama henüz ben ndimage.interpolation.zoom

a = np.array(64).reshape(8,8) 
a = ndimage.interpolation.zoom(a,.5) #decimate resolution 
nasıl kullandığını olduğunu istediğini yap

a, o zaman içinde enterpolasyon değerleri olan bir 4x4 matrisidir.

+0

faktörler tarafından azaltmak için birden fazla uygulanabilir bir kod parçası olduğunu frefcobj = m.pcolormesh (x, y, bulucu, gölgeleme = 'düz', vmin = -15, vmax = 15, cmap = cmap, zorder = 1) sütun = m.colorbar (frefcobj, "alt", size = "4%", pad = "5%", genişlet = 'her iki', keneler = aralıklar) ' diff, 699x699 dizisidir. Görevi gerçekleştirmiyor gibi görünüyor. – wuffwuff

+0

Daha önce deneme yapmayı denemedim, ancak yakınlaştırma kullanarak bir snippet ekledim. Aradığın şey bu değil mi?Şu anda görüntüyü test edemiyorum çünkü daha eski bir sürüm olan scipy'im var. Buna – Hammer

+0

İlginç görünüyor. Aradığım şey gibi 'yeniden örnekleme' gibi görünmüyor. Bunun yerine, diff dizisini aldı ve basemap penceresinde birden çok kez çizdi. Sanırım bir çeşit toplama veya çözme tekniğine ihtiyacım var. Şimdiye kadar girdiniz için teşekkürler. – wuffwuff

1

T Onun aradığın şey onun olmayabilir, ama bütünlük için bahsetmeyi düşündüm.

libsamplerate için bir Python sarıcısı olan scikits.samplerate (docs) yüklemeyi deneyebilirsiniz. Güzel, yüksek kaliteli yeniden örnekleme algoritmaları sağlar - ANCAK söyleyebileceğim kadarıyla, sadece 1D'de çalışır. 2D sinyalinizi önce bir eksen boyunca ve daha sonra tekrar örnekleyebilirsiniz. Ancak, bunun için yüksek kaliteli yeniden örneklemenin faydalarını zedeleyebilir.

+1

Evet, bu durum için çalışmaz, ancak giriş için teşekkürler. Mekansal olarak toplanabilecek bir şeye ihtiyacım var. – wuffwuff

9

Altörnekleme yaparken, enterpolasyon yapmak yanlış bir şeydir. Her zaman toplu bir yaklaşım kullanın.

Çözümü azaltmak için bir "factor" kullanarak bunu yapmak için blok araçları kullanıyorum.

import numpy as np 
from scipy import ndimage 

def block_mean(ar, fact): 
    assert isinstance(fact, int), type(fact) 
    sx, sy = ar.shape 
    X, Y = np.ogrid[0:sx, 0:sy] 
    regions = sy/fact * (X/fact) + Y/fact 
    res = ndimage.mean(ar, labels=regions, index=np.arange(regions.max() + 1)) 
    res.shape = (sx/fact, sy/fact) 
    return res 

Örneğin, 5 (5x5 blok) bir faktörü kullanarak (100, 200) şekil dizisi (20, 40) dizi sonucu ile sonuçlanır:

ar = np.random.rand(20000).reshape((100, 200)) 
block_mean(ar, 5).shape # (20, 40) 
+1

Teşekkürler, Mike. Bence çözümün benim aradığım şeyden daha fazlası. Kodunuzu uygularken, dizi boyutu uyuşmazlığı nedeniyle bir hata alıyorum: 'Dosya" diffplot.py ", satır 38, block_mean res.shape = (sx/fact, sy/fact) ValueError: total size Yeni dizinin değişmemesi gerekir ' – wuffwuff

+0

Yukarıdaki problem, faktörün orijinal dizi şekline eşit olarak bölünebilmesi gereğinden kaynaklanıyordu. Ancak, bu işlev hala uygun olmayan sonuçları sağlar. İlginç. Aradığım şey gibi 'yeniden örnekleme' gibi görünmüyor. Bunun yerine, diff dizisini aldı ve basemap penceresinde birden çok kez çizdi. Sanırım bir çeşit toplama veya çözme tekniğine ihtiyacım var. Şimdiye kadar girdiniz için teşekkürler. – wuffwuff

+0

Merhaba Mike, enterpolasyonun neden daha düşük bir örnekleme yapmak için kötü bir yol olduğunu açıklar mısınız? İnterpolasyon kötü ise, görüntü boyutlarının istenen blok büyüklüğüne göre bölünemediği durumlar ile uğraşmanın güzel bir yolu var mıdır? –

11

scikit-image çalışan bir sürümü uygulamıştır

http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.block_reduce

: eğer doğru anlamak burada downsampling arasında, her ne kadar onlar, bu DSP açısından altörnekleme olmadığı için bunu downsampling çağırarak uzak utangaç

ama çok iyi çalışıyor ve görüntüde np.nan ile uğraşabilen Python'da bulduğum tek downsampler. Bu çok hızlı bir şekilde devasa boyutlarda görüntülerim var.

1

OP sadece bir kurs özümlemesi istediği için, her bir boyutta piksel sayısının azaltılması için yolumu paylaşacağımı düşündüm. 2x2 blokların ortalamasını alırım. `findiff = scipy.misc.imresize (fark, 30, = 'çift doğrusal' interp, mod = Yok: Bu 2. Burada

from scipy.ndimage import covolve 
array_downsampled = convolve(array, np.array([[0.25,0.25],[0.25,0.25]]))[:array.shape[0]:2,:array.shape[1]:2]