我应用一个返回float的移动平均逻辑。在将它用于在OpenCV中绘制线但是低于错误
之前,我将该float转换为intValueError: 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)
关于如何解决它的任何建议?
答案 0 :(得分:6)
根据您发布的内容,您的movingAverage()
功能会在某个时间点返回NaN
。
NaN
是一个特殊的浮点标记值,意思是“不是数字”。通常,Python更喜欢引发返回NaN
的异常,因此sqrt(-1)
和log(0.0)
之类的内容通常会引发而不是返回NaN
。但是,您可以从其他库中获取此值。一个很好的例子可能是尝试从电子表格中的字符串单元格中提取数值。
标准Python提供math.isnan(x)
,您可以使用它来测试NaN
。您可以assert
反对它,在发现异常时引发异常,或者您可以为NaN
提供替换值。
您似乎正在绘制图表或图表。我的建议是专门尝试识别这个问题(为什么你得到这个特定的NaN
),然后编写一些代码来提供替换。
例如,您可以确定电子表格中的列标题负责 NaN
的此特定实例,并修复代码以跳过列标题。但是,为防止以后再次出现,您可以在isnan()
函数中检查movingAverage()
,并将任何值替换为0或最大值,从而有效地将NaN
视为0或无穷大,无论哪个对你的图表更有意义。
答案 1 :(得分:2)
您的movingAverage()
函数似乎会返回NaN值。
尝试
import numpy
int(numpy.nan)
会给你
ValueError: cannot convert float NaN to integer
测试NaN
import math, numpy
math.isnan(numpy.nan)
答案 2 :(得分:1)
这是我将熊猫数据框加载到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()}
此处的关键是dict理解中的x is not np.nan else VARCHAR2(4)
。如果您不熟悉dict comp,请读为value x if not np.nan else other value
或if np.nan then x else other value
这将返回一个字典,可用于设置dtype以将值加载到oracle中,并保留4个字节。为什么是4?为什么不呢?
答案 3 :(得分:0)
您还可以使用:
import numpy
if numpy.isnan(value):
value = numpy.nan_to_num(value)
会将NaN值更改为(可能为0.0),然后可以将其转换为整数。我可能会检查以确保它变为0对您的数据有效。
答案 4 :(得分:0)
正如@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