【问题标题】:Invalid literal for float when plotting data read from a file, and a floating point division error绘制从文件中读取的数据时浮点的无效文字,以及浮点除法错误
【发布时间】:2018-07-22 21:36:40
【问题描述】:

我有一个脚本,它获取单独的 C++ 可执行文件的输出并创建结果数据的散点图/分岔图。应用环境是通过迭代驱动力的多个值来查看角度值与驱动力的关系,以获得最终的角度并以频闪方式对结果进行采样,作为计算物理课程中关于非线性阻尼驱动摆的问题

import os
import sys
import numpy as np
import matplotlib.pyplot as plt

gbl      = 1.0
kappa    = 0.5
T_D      = 9.424778
ic_ang   = 0.1
ic_avel  = 0.0
t_final  = 200
Nstep    = 7500
method   = "runge_kutta"

ic_ang   = 0.1
Fmin     = 0.8
Fmax     = 1.6
F_D      = float(Fmin)

tstep    = T_D/(t_final/Nstep)
Nrep     = 3 * tstep
select   =[]
step     = 0.01
Nite     = (Fmax-Fmin)/step
rng      = int(Nite-1)

for i in range(rng):
    pfile= open('param.dat','w')
    pfile.write('%f %f %f %f\n' %(gbl,kappa,F_D,T_D))
    pfile.write('%f %f %f\n'%(ic_ang,ic_avel,t_final))
    pfile.write('%d %s\n'%(Nstep,method))
    pfile.close()

os.system('./a.out > bif.log')

with open("data.out",'r') as datafile:
    data=datafile.readlines()

select=data[-Nrep:Nstep:int(tstep)]

for j in select:
    plt.plot(F_D, j, "o", color='b', markersize=0.3)
    print(F_D,j)
F_D += step
plt.xlabel(r'$F_D$')
plt.ylabel(r'$\theta_{repeat}$')
#plt.xticks([])
plt.yticks([])
plt.show()

但是,当我尝试运行脚本时,我得到了

Traceback (most recent call last):
File "bif.py", line 45, in <module>
plt.plot(F_D, j, "o", color='b',markersize=0.3)

File"/System/Library/Frameworks/Python.framework/Versions/2.7/
Extras/lib/pyt hon/matplotlib/pyplot.py", line 2987, in plot
ret = ax.plot(*args, **kwargs)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/
Extras/lib/python/matplotlib/axes.py", line 4138, in plot
self.add_line(line)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/
Extras/lib/python/matplotlib/axes.py", line 1497, in add_line
self._update_line_limits(line)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/
Extras/lib/python/matplotlib/axes.py", line 1508, in 
_update_line_limits
path = line.get_path()

File "/System/Library/Frameworks/Python.framework/Versions/2.7/
Extras/lib/python/matplotlib/lines.py", line 743, in get_path
self.recache()

File "/System/Library/Frameworks/Python.framework/Versions/2.7/
Extras/lib/python/matplotlib/lines.py", line 429, in recache
y = np.asarray(yconv, np.float_)

File "/System/Library/Frameworks/Python.framework/Versions/2.7/
Extras/lib/python/numpy/core/numeric.py", line 460, in asarray
return array(a, dtype, copy=False, order=order)

ValueError: invalid literal for float(): 0 0.1 0 0.004995834722

修改一些值以尝试调试脚本会引发单独的异常

Traceback (most recent call last):
File "bif.py", line 24, in <module>
tstep    = T_D/(t_final/Nstep)
ZeroDivisionError: float division by zero

我对 Python 非常陌生,所以这些例外对我来说都没有多大意义。然而,由于Nstep、t_final 和T_D 都有有限值,所以没有理由(无论如何我可以看到)除以零错误。

我也看到ValueError 可能存在错误,因为第一列和第三列(时间和角速度)中的输出不是应有的浮点值。但是,我不知道为什么这些值没有按应有的方式转换为浮点数。

非常感谢任何帮助。

编辑:此问题已解决

【问题讨论】:

  • 错误消息通常会直接告诉您出了什么问题。所以0 0.1 0 0.004995834722 显然不是一个浮点数,而是一个长字符串。对于第二个错误,200/7500 在 python 2 中导致 0,如果这是您正在使用的。

标签: python matplotlib divide-by-zero valueerror


【解决方案1】:

我想你在这里问了两个问题,我可以看到最后一个关于除以零的问题更容易。即,表达式t_final/Nstep,现在在您的代码中,是an integer division expression,结果是0。因此这条线

tstep    = T_D/(t_final/Nstep)

除以零。

第二个问题是为什么matplotlib 抱怨数据。要真正诊断这个问题,我们需要查看程序读取的数据文件的内容。但是,我认为问题源于您尝试将文本(Python 字符串)传递给期望数字数据类型的函数。当您readlines() 输入文件时,我认为您没有进行任何转换。结果,一段文本字符串被传递给plt.plot,matplotlib 努力从这个表示中构造一个数字数据类型。如果您读取数据,根据文件格式和分析逻辑进行适当的转换,那就更好了。如果您正在处理文本数据文件,您可能需要查看numpy.loadtxt。

【讨论】:

  • 谢谢您的回复先生。我修复了除以零错误。就像你说的,我忽略了我的输入变量并且正在做整数除法。我犯了愚蠢的错误。对于第二个问题,我想我明白你在说什么。 Data.out 是一个数值的文本数组,所以如果我为我的 datafile.readlines() 添加一个浮点转换命令,它应该将整个数组转换为浮点数,然后我可以按原样分析数据,对吗?如果这是一个糟糕的问题,我深表歉意,正如我之前所说,我对 python 编程非常陌生。
猜你喜欢
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多