2012-06-06 18 views
18

मैं सूचियों की एक सूची है: कुछ की तरह:औसत सूची

data = [[240, 240, 239], 
     [250, 249, 237], 
     [242, 239, 237], 
     [240, 234, 233]] 

और मैं इस तरह बाहर औसत करने के लिए चाहते हैं

[average_column_1, average_column_2, average_column_3] 

कोड का मेरा टुकड़ा बहुत ही सुंदर नहीं की तरह है । सूची के माध्यम से जाने का यह बेवकूफ तरीका है, योग को अलग कंटेनर में रखते हुए और फिर तत्वों की संख्या से विभाजित करना।

मुझे लगता है कि ऐसा करने के लिए एक पाइथोनिक तरीका है। कोई सुझाव? धन्यवाद

उत्तर

36

शुद्ध पायथन:

from __future__ import division 
def mean(a): 
    return sum(a)/len(a) 
a = [[240, 240, 239], 
     [250, 249, 237], 
     [242, 239, 237], 
     [240, 234, 233]] 
print map(mean, zip(*a)) 

मुद्रण

[243.0, 240.5, 236.5] 

NumPy:

a = numpy.array([[240, 240, 239], 
       [250, 249, 237], 
       [242, 239, 237], 
       [240, 234, 233]]) 
print numpy.mean(a, axis=0) 

अजगर 3:

from statistics import mean 
print(*map(mean, zip(*a)) 
+0

'itertools आयात imap, izip' – schlamar

+3

@ ms4py: 'future_builtins से आयात करें मानचित्र, ज़िप' से पसंदीदा ' – georg

+0

@ thg435 यह नया है, जानना अच्छा है :) – schlamar

13

उपयोग zip(), इसलिए जैसे:

averages = [sum(col)/float(len(col)) for col in zip(*data)] 

zip() कई iterable तर्क लेता है, और उन iterables की स्लाइस रिटर्न (tuples के रूप में), जब तक iterables में से एक कुछ भी अधिक नहीं लौट सकते। असल में, यह matrices के समान, एक ट्रांज़ेक्शन ऑपरेशन करता है।

>>> data = [[240, 240, 239], 
...   [250, 249, 237], 
...   [242, 239, 237], 
...   [240, 234, 233]] 

>>> [list(col) for col in zip(*data)] 
[[240, 250, 242, 240], 
[240, 249, 239, 234], 
[239, 237, 237, 233]] 

उन स्लाइस में से प्रत्येक पर sum() करने पर, आपके प्रभावी रूप से स्तंभ-वार योग मिलता है। मतलब प्राप्त करने के लिए बस कॉलम की लंबाई से विभाजित करें।

साइड पॉइंट: पायथन 2.x में, पूर्णांक पर विभाजन डिफ़ॉल्ट रूप से दशमलव को फर्श करता है, यही कारण है कि float() को परिणाम को "फ़्लोटिंग पॉइंट प्रकार" को बढ़ावा देने के लिए कहा जाता है।

+0

लंबाई से विभाजित करना न भूलें;) – mgilson

+5

वर्थिंग एक स्पष्टीकरण जोड़ना: 'ज़िप' एक ऐसा फ़ंक्शन है जो एकाधिक अनुक्रम लेता है और "कॉलम-बाय-कॉलम" आधार पर टुपल्स देता है। तो यह लौटाता है (एक्स [0] [0], एक्स [1] [0], एक्स [2] [0]) फिर (एक्स [1] [0], एक्स [1] [1], एक्स [1] [2]) और इतने पर। हालांकि, किसी दिए गए लाइन के लिए आइटमों से बाहर निकलने पर यह पुनर्प्राप्त करना बंद कर देगा। कोड में आरेखण करना आसान है, यह दिखाने के लिए कि यह कैसे काम करता है? – Crisfole

18
data = [[240, 240, 239], 
     [250, 249, 237], 
     [242, 239, 237], 
     [240, 234, 233]] 
avg = [float(sum(col))/len(col) for col in zip(*data)] 
# [243.0, 240.5, 236.5] 

यह काम करता है क्योंकि zip(*data) आपको समूहित कॉलम के साथ एक सूची देगा, float() कॉल केवल पायथन 2.x पर आवश्यक है, जो from __future__ import division का उपयोग नहीं होने तक पूर्णांक विभाजन का उपयोग करता है।

+0

मुझे विश्वास है कि यह जवाब सबसे अच्छा है। यह भी पहला था। –

+1

@BlaXpirit: एसओ पर गति पर बहुत अधिक जोर दिया जाता है - महत्वपूर्ण बात गुणवत्ता होना चाहिए। यह भी ध्यान रखें कि यह उत्तर तीसरा (या चौथा, अगर हम हटाए गए उत्तर को गिनते हैं) आया। –

1
import numpy as np 

data = [[240, 240, 239], 
     [250, 249, 237], 
     [242, 239, 237], 
     [240, 234, 233]] 

np.mean(data, axis=0) 
# array([ 243. , 240.5, 236.5]) 

काम करने लगता है।

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