[英]Python: Can't convert float NaN to integer
我应用了一个返回浮动的移动平均逻辑。 在使用它在 OpenCV 中绘制线条之前,我将该浮点数转换为 int 但低于错误
ValueError: cannot convert float NaN to integer
示例代码
def movingAverage(avg, new_sample, N=20):
if (avg == 0):
return new_sample
avg -= avg / N;
avg += new_sample / N;
return avg;
x1 = int(avgx1) #avgx1 is returned from the movingaverage function
y1 = int(avgy1)
x2 = int(avgx2)
y2 = int(avgy2)
cv2.line(img, (x1, y1), (x2, y2), [255,255,255], 12)
关于如何解决它的任何建议?
根据您发布的内容,您的movingAverage()
函数在某个时候返回NaN
。
NaN
是一个特殊的浮点标记值,意思是“不是数字”。 一般来说,Python 更喜欢引发异常而不是返回NaN
,因此sqrt(-1)
和log(0.0)
通常会引发而不是返回NaN
。 但是,您可能会从其他某个库中获取此值。 一个很好的例子可能是尝试从电子表格中的字符串单元格中提取数值。
标准 Python 提供math.isnan(x)
可用于测试NaN
。 您可以针对它进行assert
,在找到时引发异常,或者您可以为NaN
提供替换值。
您似乎正在绘制图表或图形。 我的建议是专门尝试找出这个问题(你为什么要得到这个特定的NaN
),然后编写一些代码来提供替换。
例如,您可能确定电子表格中的列标题负责NaN
这个特定实例,并修复代码以跳过列标题。 但是,为了防止以后再次发生,您可以在movingAverage()
函数中检查isnan()
,并将任何值替换为 0 或最大值,有效地将NaN
视为 0 或无穷大,以对您更有意义的为准图形。
您的movingAverage()
函数似乎返回NaN 值。
尝试
import numpy
int(numpy.nan)
会给你
ValueError: cannot convert float NaN to integer
测试 NaN
import math, numpy
math.isnan(numpy.nan)
您还可以使用:
import numpy
if numpy.isnan(value):
value = numpy.nan_to_num(value)
这会将 NaN 值更改为(可能是 0.0),然后可以将其转换为整数。 我可能会检查以确保它变为 0 适用于您的数据。
这是我将熊猫数据帧加载到 oracle dbms 的解决方案。
{c:VARCHAR2(df[c].str.len().max()) if df[c].str.len().max() + 4 is not np.nan else VARCHAR2(4)
for c in df.columns[df.dtypes == 'object'].tolist()}
这里的关键是x is not np.nan else VARCHAR2(4)
在字典理解中。 如果您不熟悉 dict comps, value x if not np.nan else other value
读作value x if not np.nan else other value
or if np.nan then x else other value
这将返回一个字典,该字典可用于设置 dtype 以将值加载到 oracle 中,并保留 4 个字节。 为什么是4? 为什么不?
正如@mdh 指出的,您不能将 np.nan 值转换为整数。 一个解决方案是使用try
和except
语句来捕捉这个特殊情况(但你应该确保,你知道,为什么函数返回 nan 的):
try:
x1 = int(avgx1) #avgx1 is returned from the movingaverage function
except ValueError:
# if ValueError is raised, assign 0 to avgx1
x1 = 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.