som*_*ode 8 python numpy nan pandas numpy-dtype
我正在尝试使用 scikit learn 拟合一个简单的机器学习模型。在这条线上:
clf.fit(features, labels)
Run Code Online (Sandbox Code Playgroud)
我得到一个熟悉的错误:
Input contains NaN, infinity or a value too large for dtype('float64').
Run Code Online (Sandbox Code Playgroud)
每当我之前遇到过这种情况时,我的数据中就有 NaN 值。我已经确认数据中没有 NaN。.fit() 方法的两个输入(特征和标签)是 np 数组,但它们是从 Pandas 数据帧生成的。在拉出我打印的 NaN 值之前:
print(features_df[features_df.isnull().any(axis=1)])
print(labels_df[labels_df.isnull().any(axis=1)])
Run Code Online (Sandbox Code Playgroud)
这打印了空数据帧,所以我知道其中没有包含 NaN 值的行。我还在转换后检查了 numpy 数组的 NaN 值,甚至使用 np sum() 方法成功地对它们求和,因此传递到 fit 的特征或标签 np 数组中没有 NaN 值。
这意味着必须有无穷大的值或非常大的值,我觉得这两者都令人难以置信。有什么方法可以打印数据帧或 np 数组中的任何值:
are NaN, infinity or a value too large for dtype('float64')?
Run Code Online (Sandbox Code Playgroud)
我需要特别指出它们,因为我无法用肉眼找到它们并且没有 NaN 值。
假设这是 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]]
Run Code Online (Sandbox Code Playgroud)
要检查 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
Run Code Online (Sandbox Code Playgroud)
分别。每个都返回一个 bool 数组,并将 bool 数组传递numpy.where()给我们两个索引数组(每个维度一个索引数组ar):
ar_nan = np.where(np.isnan(ar))
print (ar_nan)
Run Code Online (Sandbox Code Playgroud)
(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)
Run Code Online (Sandbox Code Playgroud)
(array([2], dtype=int64), array([2], dtype=int64)) # 意思是,inf 在 (2,2)
另外,要查看 float64 的限制:
np.finfo(np.float64)
Run Code Online (Sandbox Code Playgroud)
finfo(分辨率=1e-15,最小值=-1.7976931348623157e+308,最大值=1.7976931348623157e+308,dtype=float64)
| 归档时间: |
|
| 查看次数: |
6406 次 |
| 最近记录: |