如何在numpy数组中找到Natype / infinity / dtype('float64')太大的值?

时间:2019-03-16 05:18:41

标签: python pandas numpy scikit-learn nan

我正在尝试使用scikit Learn拟合一个简单的机器学习模型。在这一行:

clf.fit(features, labels)

我遇到一个熟悉的错误:

 Input contains NaN, infinity or a value too large for dtype('float64').

无论何时我遇到过NaN值都在我的数据中之前。我已经确认数据中没有NaN。 .fit()方法的两个输入(功能和标签)是np数组,但它们是从pandas数据帧生成的。就在提取我打印的NaN值之前:

print(features_df[features_df.isnull().any(axis=1)])
print(labels_df[labels_df.isnull().any(axis=1)])

这打印了空的数据框,所以我知道其中没有NaN值的行。转换后,我还检查了numpy数组中的NaN值,甚至使用np sum()方法成功地对它们进行了求和,因此在传递给fit的要素或标签中没有NaN值。

这意味着必须有无穷大或非常大的值,我很难相信这两者。有什么方法可以在数据框或np数组中打印以下任何值:

are NaN, infinity or a value too large for dtype('float64')?

由于我无法用眼睛找到它们并且没有NaN值,因此需要特别向我指出。

1 个答案:

答案 0 :(得分:0)

假设这是numpy数组,形状为(3,3)

ar = np.array([1, 2, 3, 4, np.nan, 5, np.nan, 6, np.inf]).reshape((3,3))
print (ar)
[[ 1.  2.  3.]
 [ 4. nan  5.]
 [nan  6. inf]]

要检查NaN,无穷大和负无穷大,我们可以使用:

numpy.isnan(ar)
numpy.isinf(ar)
numpy.isneginf(ar)

分别。每个都返回一个bool数组,并将bool数组传递给numpy.where()会给我们两个索引数组({{1}的每个维度一个索引数组):

ar
  

(array([1,2],dtype = int64),array([1,0],dtype = int64))#均值,nans   在(1,1)和(2,0)

ar_nan = np.where(np.isnan(ar))
print (ar_nan)
  

(array([2],dtype = int64),array([2],dtype = int64))#表示inf在   (2,2)

还要查看float64的限制:

ar_inf = np.where(np.isinf(ar))
print (ar_inf)
  

finfo(resolution = 1e-15,min = -1.7976931348623157e + 308,   max = 1.7976931348623157e + 308,dtype = float64)