如何在我的 numpy 数组中找到 NaN/infinity/对于 dtype('float64') 来说太大的值?

Posted

技术标签:

【中文标题】如何在我的 numpy 数组中找到 NaN/infinity/对于 dtype(\'float64\') 来说太大的值?【英文标题】:How do I find the values in my numpy array that are NaN/infinity/too large for dtype('float64')?如何在我的 numpy 数组中找到 NaN/infinity/对于 dtype('float64') 来说太大的值? 【发布时间】:2019-08-07 04:30:57 【问题描述】:

我正在尝试使用 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 的特征或标签 np 数组中没有 NaN 值。

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

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

我需要让它们专门向我指出,因为我无法用我的眼睛找到它们并且没有 NaN 值。

【问题讨论】:

您是否尝试过过滤掉类似以下内容的值:df = df[df.column_name.notnull()]df = df[df.notnull()] 应该也可以工作。 df 是熊猫数据框 我不知道对于 float64 来说太大的值(你是如何将它们放入数组的?)但是 +/-inf,nan,你可以使用 ~np.isfinite 找到,领先的 tilda 反转掩码。如果您需要索引而不是掩码,请在掩码上使用 np.where 【参考方案1】:

假设这是 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)     # True wherever nan
numpy.isposinf(ar)  # True wherever pos-inf
numpy.isneginf(ar)  # True wherever neg-inf
numpy.isinf(ar)     # True wherever pos-inf or neg-inf
~numpy.isfinite(ar) # True wherever pos-inf or neg-inf or nan

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

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

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

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

(array([2], dtype=int64), array([2], dtype=int64)) # 意思是,inf 在 (2,2)

另外,看看float64的限制:

np.finfo(np.float64)

finfo(分辨率=1e-15, min=-1.7976931348623157e+308, 最大值=1.7976931348623157e+308, dtype=float64)

【讨论】:

以上是关于如何在我的 numpy 数组中找到 NaN/infinity/对于 dtype('float64') 来说太大的值?的主要内容,如果未能解决你的问题,请参考以下文章

IEEE754 浮点数系统中的 NaN 和 +-INF

如何有效地找到 NumPy 中平滑多维数组的局部最小值?

do_one(nmeth) 中的错误:外部函数调用中的 NA/NaN/Inf (arg 1)

如何找到numpy数组的每两行的平均值

如何在 numpy 数组中找到行索引的最大值?

如何在Python中搜索Numpy数组中的数字