2014-11-01 11 views
23

मैं अपने matplotlib ग्राफ के लिए सबसे अच्छी फिट की रैखिक रेखा फिट करने की कोशिश कर रहा हूं। मैं त्रुटि प्राप्त करता रहता हूं कि x और y में पहले आयाम नहीं है। लेकिन दोनों की लंबाई 15 है। मैं क्या गलत कर रहा हूँ?Matplotlib: ValueError: x और y में पहले आयाम होना चाहिए

import matplotlib.pyplot as plt 
from scipy import stats 
import numpy as np 

x = [0.46,0.59,0.68,0.99,0.39,0.31,1.09,0.77,0.72,0.49,0.55,0.62,0.58,0.88,0.78] 
y = [0.315,0.383,0.452,0.650,0.279,0.215,0.727,0.512,0.478,0.335,0.365,0.424,0.390,0.585,0.511] 
xerr = [0.01]*15 
yerr = [0.001]*15 

plt.rc('font', family='serif', size=13) 
m, b = np.polyfit(x, y, 1) 
plt.plot(x,y,'s',color='#0066FF') 
plt.plot(x, m*x + b, 'r-') #BREAKS ON THIS LINE 
plt.errorbar(x,y,xerr=xerr,yerr=0,linestyle="None",color='black') 
plt.xlabel('$\Delta t$ $(s)$',fontsize=20) 
plt.ylabel('$\Delta p$ $(hPa)$',fontsize=20) 
plt.autoscale(enable=True, axis=u'both', tight=False) 
plt.grid(False) 
plt.xlim(0.2,1.2) 
plt.ylim(0,0.8) 
plt.show() 
+2

तो कैसे आप अपनी समस्या को हल करने के लिए, बस सरणियों Numpy को बदलने खत्म किया? –

उत्तर

29

आप x और y NumPy सरणी, नहीं सूचियों बनाना चाहिए:

x = np.array([0.46,0.59,0.68,0.99,0.39,0.31,1.09, 
       0.77,0.72,0.49,0.55,0.62,0.58,0.88,0.78]) 
y = np.array([0.315,0.383,0.452,0.650,0.279,0.215,0.727,0.512, 
       0.478,0.335,0.365,0.424,0.390,0.585,0.511]) 
इस बदलाव के साथ

, यह साजिश की उम्मीद पैदा करता है। यदि वे सूचियां हैं, तो m * x आपके द्वारा अपेक्षित परिणाम का उत्पादन नहीं करेगा, बल्कि एक खाली सूची होगी। ध्यान दें कि m एक numpy.float64 स्केलर है, मानक पायथन float नहीं।

मैं वास्तव में यह अम्पी के थोड़ा संदिग्ध व्यवहार पर विचार करता हूं। सामान्य अजगर में, एक पूर्णांक के साथ एक सूची गुणा बस सूची को दोहराता है:

In [42]: 2 * [1, 2, 3] 
Out[42]: [1, 2, 3, 1, 2, 3] 

जबकि एक नाव के साथ एक सूची गुणा एक त्रुटि (के रूप में मुझे लगता है कि यह होना चाहिए) देता है:

In [43]: 1.5 * [1, 2, 3] 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-43-d710bb467cdd> in <module>() 
----> 1 1.5 * [1, 2, 3] 
TypeError: can't multiply sequence by non-int of type 'float' 

अजीब बात कि एक Numpy अदिश के साथ एक अजगर सूची गुणा जाहिरा तौर पर काम करता है:

In [45]: np.float64(0.5) * [1, 2, 3] 
Out[45]: [] 

In [46]: np.float64(1.5) * [1, 2, 3] 
Out[46]: [1, 2, 3] 

In [47]: np.float64(2.5) * [1, 2, 3] 
Out[47]: [1, 2, 3, 1, 2, 3] 

तो ऐसा लगता है कि नाव को पूर्णांक में छोटा कर दिया जाता है, जिसके बाद आप दोहरा वीं के मानक अजगर व्यवहार मिलता है ई सूची, जो काफी अप्रत्याशित व्यवहार है। सबसे अच्छी बात यह है कि एक त्रुटि उठाना होगा (ताकि आप स्टैक ओवरफ्लो पर अपना प्रश्न पूछने के बजाय स्वयं समस्या को देख सकें) या केवल अपेक्षित तत्व-वार गुणा दिखाएं (जिसमें आपका कोड अभी काम करेगा) । दिलचस्प बात यह है एक सूची है और एक Numpy अदिश के बीच इसके अलावा करता है काम:

In [69]: np.float64(0.123) + [1, 2, 3] 
Out[69]: array([ 1.123, 2.123, 3.123]) 
+0

प्रतीक्षा करें मुझे यह नहीं मिला, समस्या क्या थी? बस 'np.array' की चीजों को हल करने के लिए कनवर्ट करना? –

+0

@CharlieParker: हाँ यह काम करता है। यहाँ कुछ भी अजीब नहीं है, मुझे समझाओ। जब ओपी ने किया था, बी = एनपी.polyfit (एक्स, वाई, 1) ', यहां आप 'm' एक फ्लोट 64 मान होने के लिए मिलता है, उदाहरण के लिए उपरोक्त मामले में' m = 0.642'। अब जब आप 'x'' सूची के साथ एक फ्लोट 'm' गुणा करने का प्रयास करते हैं, तो आप एक खाली सूची '[]' प्राप्त कर लेते हैं। ऐसा इसलिए है क्योंकि किसी सूची के प्रत्येक तत्व को मान के साथ गुणा करने के लिए, आपको सूची को 'numpy array' में परिवर्तित करने या 'मानचित्र' फ़ंक्शन में निर्मित करने की आवश्यकता होती है। अधिक जानकारी के लिए [यह उत्तर] देखें (https://stackoverflow.com/questions/8194959/how-to-multiply- व्यक्तिगत-elements-of-a-list-with-a-number)। – ThePredator

5

numpy सरणियों में अपनी सूचियां बदलने काम करेगा !!

import matplotlib.pyplot as plt 
from scipy import stats 
import numpy as np 

x = np.array([0.46,0.59,0.68,0.99,0.39,0.31,1.09,0.77,0.72,0.49,0.55,0.62,0.58,0.88,0.78]) # x is a numpy array now 
y = np.array([0.315,0.383,0.452,0.650,0.279,0.215,0.727,0.512,0.478,0.335,0.365,0.424,0.390,0.585,0.511]) # y is a numpy array now 
xerr = [0.01]*15 
yerr = [0.001]*15 

plt.rc('font', family='serif', size=13) 
m, b = np.polyfit(x, y, 1) 
plt.plot(x,y,'s',color='#0066FF') 
plt.plot(x, m*x + b, 'r-') #BREAKS ON THIS LINE 
plt.errorbar(x,y,xerr=xerr,yerr=0,linestyle="None",color='black') 
plt.xlabel('$\Delta t$ $(s)$',fontsize=20) 
plt.ylabel('$\Delta p$ $(hPa)$',fontsize=20) 
plt.autoscale(enable=True, axis=u'both', tight=False) 
plt.grid(False) 
plt.xlim(0.2,1.2) 
plt.ylim(0,0.8) 
plt.show() 

enter image description here

+0

यह क्यों काम करता है? मुझे यह वास्तव में अजीब लगता है। –

+0

@CharlieParker: हाँ यह काम करता है। यहाँ कुछ भी अजीब नहीं है, मुझे समझाओ। जब ओपी ने किया था, बी = एनपी.polyfit (एक्स, वाई, 1) ', यहां आप 'm' एक फ्लोट 64 मान होने के लिए मिलता है, उदाहरण के लिए उपरोक्त मामले में' m = 0.642'। अब जब आप 'x'' सूची के साथ एक फ्लोट 'm' गुणा करने का प्रयास करते हैं, तो आप एक खाली सूची '[]' प्राप्त कर लेते हैं। ऐसा इसलिए है क्योंकि किसी सूची के प्रत्येक तत्व को मान के साथ गुणा करने के लिए, आपको सूची को 'numpy array' में परिवर्तित करने या 'मानचित्र' फ़ंक्शन में निर्मित करने की आवश्यकता होती है। अधिक जानकारी के लिए [यह उत्तर] देखें (https://stackoverflow.com/questions/8194959/how-to-multiply- व्यक्तिगत-elements-of-a-list-with-a-number)। – ThePredator

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