2012-06-01 17 views
6

मेरे पास फ्लोट के साथ एक numpy सरणी है।एक numpy सरणी पर सब्सप्लिंग/औसत

मैं क्या चाहता हूं (यदि यह पहले से मौजूद नहीं है) एक ऐसा फ़ंक्शन है जो मुझे दिए गए सरणी में प्रत्येक एक्स बिंदुओं के औसत की एक नई सरणी देता है, जैसे सब नमूनाकरण (और इंटरपोलेशन (?) के विपरीत)।

उदा। sub_sample (numpy.array ([1, 2, 3, 4, 5, 6]), 2) देता है [1.5, 3.5, 5.5]

उदा। बचे हुए को हटाया जा सकता है, उदा। sub_sample (numpy.array ([1, 2, 3, 4, 5]), 2) देता है [1.5, 3.5]

अग्रिम धन्यवाद।

उत्तर

17

का उपयोग NumPy दिनचर्या आप की तरह

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]) 

कुछ की कोशिश कर सकते हैं और बस आइटम्स की संख्या के साथ reshape कॉल में 2 की जगह आप पर औसत करने के लिए चाहते हैं ।

संपादित करें: यह मानता है कि nx की लंबाई में विभाजित है। यदि आप इसे सामान्य कार्य में बदलने जा रहे हैं तो आपको कुछ चेक शामिल करने की आवश्यकता होगी। कार्रवाई में

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

यह समारोह: शायद कुछ इस तरह

>>> 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

यह ठीक काम करता है, सिवाय इसके कि विंडो आकार (ऊपर उदाहरण में 2) सरणी की लंबाई का गुणा नहीं है, लेकिन मैं यह सुनिश्चित कर सकता हूं कि यह है। धन्यवाद! –

+1

@MichelKeijzers बस इसके बारे में सोचें, मेरा संपादन देखें। – Chris

+0

धन्यवाद ... हाँ यह वही था जो मैं भी सोच रहा था। –

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) 

देता है:

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

धन्यवाद मैं यह कोशिश करेंगे, हालांकि मुझे उम्मीद है कि एक numpy समारोह क्योंकि वे तेजी से सबसे समान अजगर समारोह के रूप में लगभग 10 गुना हो जाते हैं नहीं होगा। –

-1

यह भी एक एक पंक्ति समाधान है कि काम करना चाहिए है:

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

"एक" के साथ वेक्टर है आपके डेटा और "एन" आपका नमूना कदम है।

पुनश्च: from numpy import *

+0

यह ओपी द्वारा वांछित '1.5, 3.5, 5.0]' - '1.5 [3.5]' नहीं देता है। 'Numpy' से सभी आयात करने के बजाय' np.size() 'का भी उपयोग करें। –

संबंधित मुद्दे