2011-02-12 16 views
13

Matplotlib büyük veri kümelerini işlemede iyi olan here'u okudum. Bir veri işleme uygulaması yazdım ve matplotlib grafiklerini wx içine gömdüm ve matplotlib'in hem hız hem de bellek açısından büyük miktarlarda veriyi işlerken KORKUMLU olduğunu buldum. Matplotlib'in girişlerinizi küçültmekten başka bir şeyi hızlandırmanın bir yolu olduğunu biliyor musunuz? 10M noktaları çizmek matplotlib bellek ve zaman bir demet tüketir -Hız up Matplotlib?

import pylab 
import numpy 
a = numpy.arange(int(1e7)) # only 10,000,000 32-bit integers (~40 Mb in memory) 
# watch your system memory now... 
pylab.plot(a) # this uses over 230 ADDITIONAL Mb of memory 
+7

Daima küçültülmüştüm. Neden bir grafiğe 10M puan vermeyi denemelisiniz? – Paul

+1

matplotlib yavaş. Bu bilinen bir gerçektir. Qt için guiqwt paketini kullanıyorum, belki de wx için böyle bir şey var. – tillsten

+1

@paul Kullanıcılarımın verileri grafiksel olarak keşfetmesini kolaylaştırmak istedim. yani, yakınlaştırdıklarında, yakınlaştırma sınırlarına bağlı olarak tekrar örnek vermek istemedim, gerçek verileri nasıl yakınlaştırılmış/kaydırılmış olursa olsun görürlerdi. –

cevap

4

Altörnekleme burada iyi bir çözümdür:

bu kodu düşünün bellek ile ne kadar kötü matplotlib göstermek için. Ne kadar belleğin kabul edilebilir olduğunu biliyorsanız, o miktara göre alt değerlere ayırabilirsiniz.

if(len(a) > 1M): 
    a = scipy.signal.decimate(a, int(len(a)/1M)+1) 
pylab.plot(a) 

Ya da bir şey gibi: Örneğin, 1M puan diyelim nedenle her zaman 1M puanın altında olacak şekilde altörnekleyebilirsiniz gerektiğini, bellek ilave 23 MB alır ve bunu zaman ve mekan açısından kabul edilebilir bulmak yukarıdaki pasajı (. yukarıdaki tatmak için çok agresif altörnekleyebilirsiniz olabilir)

+1

Basit bir eksiklik yetersizdir ve Matplotlib'in söyleyebileceğim kadarıyla dahili olarak yaptığı şeydir. Sadece kısaltmak istemememin nedeni, her bir belirsizlik aralığındaki aşırı değerleri kaybetmenizdir. Eğer bir aralık içinde sinyalin keskin bir sivri olması gerekiyorsa, aralıklarla çok şanslı olmadıkça, arsada göremezsiniz. Bunu daha akıllıca yapan bir kod yazdım, aralığın (veya kenar) ortasındaki değer yerine her bir sınırlama aralığı için uç değerler aldım. Cevabını kabul ediyorum, çünkü bu benim yaptığım şeyde. –

+4

David - bunu daha 'akıllıca' çözdüyseniz paylaşmayı düşünür müsün? Kendi cevaplarınızı 'çözülmüş' olarak işaretleyebilir ve bir kaç oy alabilirsin ... – danodonovan

+0

@Dave: Bunu nasıl çözdüğünle ilgileniyorsun –

1

Ben veri yığınlarını komplo olmadan önce bu şekilde devam da o kadar uç değerler genellikle ilgilendiğim:

import numpy as np 

s = np.random.normal(size=(1e7,)) 
decimation_factor = 10 
s = np.max(s.reshape(-1,decimation_factor),axis=1) 

# To check the final size 
s.shape 

Elbette np.max j aşırı hesaplama fonksiyonu örneği.

P.S. numpy ile "strides tricks", yeniden şekillendirme sırasında verileri kopyalamaktan kaçınmak mümkün olmalıdır.