Python:不能将float NaN转换为整数

时间:2017-02-25 23:56:27

标签: python opencv

我应用一个返回float的移动平均逻辑。在将它用于在OpenCV中绘制线但是低于错误

之前,我将该float转换为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)

关于如何解决它的任何建议?

5 个答案:

答案 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 valueif 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值转换为整数。一种解决方案是使用tryexcept语句来捕获这种特殊情况(但您应该确保知道为什么函数返回nan):

try:
    x1 = int(avgx1) #avgx1 is returned from the movingaverage function
except ValueError:
    # if ValueError is raised, assign 0 to avgx1
    x1 = 0