所以我在尝试输入一组数据点时使用线性回归来显示趋势线。我正在使用Tkinter获取数据的输入,然后将它们转换为float以将它们放入列表中。我在运行程序时得到了这个错误代码。
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__
return self.func(*args)
File "C:/Users/NIBO9901/PycharmProjects/Matteuppgift/Trendlinje/Input.py", line 78, in plot
m, c = np.linalg.lstsq(a, y)[0]
File "C:\Python27\lib\site-packages\numpy\linalg\linalg.py", line 1889, in lstsq
nlvl = max( 0, int( math.log( float(min(m, n))/2. ) ) + 1 )
ValueError: math domain error
它所引用的代码在这里:
xList = []
yList = []
x = np.array(xList)
y = np.array(yList)
if 0 < len(inpX0.get()):
xList.append(float(inpX0.get()))
if 0 < len(inpX1.get()):
xList.append(float(inpX1.get()))
if 0 < len(inpY0.get()):
yList.append(float(inpY0.get()))
if 0 < len(inpY1.get()):
yList.append(float(inpY1.get()))
a = np.vstack([x, np.ones(len(x))]).T
m, c = np.linalg.lstsq(a, y)[0]
plt.plot(x, y, 'o', label='Data', markersize=10)
plt.plot(x, m*x + c, 'r', label='Trendlinje')
plt.legend()
plt.show()
inpX / Y是Tkinter条目。
答案 0 :(得分:1)
numpy数组是静态结构。首先必须填充列表,然后将其转换为numpy数组。之后,对列表的修改将不再对numpy数组产生影响。
所以你想要做的可能是:
xList = []
yList = []
if 0 < len(inpX0.get()):
xList.append(float(inpX0.get()))
if 0 < len(inpX1.get()):
xList.append(float(inpX1.get()))
if 0 < len(inpY0.get()):
yList.append(float(inpY0.get()))
if 0 < len(inpY1.get()):
yList.append(float(inpY1.get()))
a = np.vstack([x, np.ones(len(x))]).T
m, c = np.linalg.lstsq(a, y)[0]
# the lists are complete, now convert them to numpy arrays
x = np.array(xList)
y = np.array(yList)
plt.plot(x, y, 'o', label='Data', markersize=10)
plt.plot(x, m*x + c, 'r', label='Trendlinje')
plt.legend()
plt.show()