[英]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.