如何在我的 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') 来说太大的值?的主要内容,如果未能解决你的问题,请参考以下文章