2012-06-01 33 views
6

Şamandıralı bir numpy dizilim var. Bir numpy dizisi üzerinde alt örnekleme/ortalama alma

Sahip olmak istediğim (eğer mevcut değilse), verilen örneklemdeki her x noktasının ortalamasının alt örneklemi (ve enterpolasyonun karşıtı) (?) Gibi yeni bir dizi sağlayan bir işlevdir.).

E.g. sub_sample (numpy.array ([1, 2, 3, 4, 5, 6]), 2), [1.5, 3.5, 5.5]

E.g. Artıklar, örn. sub_sample (numpy.array ([1, 2, 3, 4, 5]), 2), [1,5, 3.5]

'u şimdiden verir.

cevap

17

kullanma NumPy rutinleri Eğer

import numpy 

x = numpy.array([1, 2, 3, 4, 5, 6]) 

numpy.mean(x.reshape(-1, 2), 1) # Prints array([ 1.5, 3.5, 5.5]) 

gibi bir şey denemek ve sadece üzerinde ortalama istediğiniz öğelerin sayısı ile reshape çağrısında 2 yerini alabilir .

Düzenleme: Bu nx uzunluğu ayrılır varsayar. Bunu genel bir işleve dönüştürecekseniz bazı kontroller eklemeniz gerekecek. Böyle Belki bir şey:

def average(arr, n): 
    end = n * int(len(arr)/n) 
    return numpy.mean(arr[:end].reshape(-1, n), 1) 

Bu fonksiyon eylem:

>>> x = numpy.array([1, 2, 3, 4, 5, 6]) 
>>> average(x, 2) 
array([ 1.5, 3.5, 5.5]) 

>>> x = numpy.array([1, 2, 3, 4, 5, 6, 7]) 
>>> average(x, 2) 
array([ 1.5, 3.5, 5.5]) 
+1

Bu, pencere boyutu (örneğin, yukarıdaki örnekte) dizinin uzunluğunun bir çarpımı olmadığı durumlar dışında iyi çalışır, ancak bunun olduğundan emin olabilirim. Teşekkürler! –

+1

@MichelKeijzers Sadece bir düşünün, benim düzenlemeye bakın. – Chris

+0

teşekkürler ... evet, aynı zamanda düşündüğüm de buydu. –

3
def subsample(data, sample_size): 
    samples = list(zip(*[iter(data)]*sample_size)) # use 3 for triplets, etc. 
    return map(lambda x:sum(x)/float(len(x)), samples) 

l = [1, 2, 3, 4, 5, 6] 

print subsample(l, 2) 
print subsample(l, 3) 
print subsample(l, 5) 

verir:

[1.5, 3.5, 5.5] 
[2.0, 5.0] 
[3.0] 
+1

ancak onlar yaklaşık 10 kat daha hızlı en benzer Python fonksiyonu olarak olma eğilimindedir, çünkü bir numpy işlevi olacak umut, bunu deneyecek teşekkür ederiz. –

-1

bu çalışması gerekir bir tek satır çözüm de geçerli:

downsampled_a = [a[i:n+i].mean() for i in range(0,size(a),n)] 

"a" ile vektör aşağıdadır veri ve "n" örnekleme adımınız.

PS: from numpy import *

+0

OP tarafından istenen [1,5, 3,5, 5.0] '- değil' [1.5, 3.5] 'döndürür. Ayrıca 'numpy'den tümünün içe aktarılması yerine np.size() işlevini kullanın. –

İlgili konular