Sha*_* H. 1 python numpy pandas scikit-learn
所以,我正在研究一个管道,在安装它时我偶然发现了这个错误:
Traceback (most recent call last):
File "C:/Users/Shawn/Documents/temp/bool_issue.py", line 7, in <module>
_assert_all_finite(array, False)
File "C:\Users\Shawn\AppData\Local\Programs\Python\Python38\lib\site-packages\sklearn\utils\validation.py", line 103, in _assert_all_finite
if _object_dtype_isnan(X).any():
AttributeError: 'bool' object has no attribute 'any'
Run Code Online (Sandbox Code Playgroud)
这实际上是一些测试问题的自定义代码,见下文
在回溯之后,我看到它_object_dtype_isnan()采用一个 numpy 数组,并以布尔掩码(布尔数组)的形式返回另一个 numpy 数组。
但是,由于某种原因,它有时会直接返回布尔值。
重现错误的代码:
Traceback (most recent call last):
File "C:/Users/Shawn/Documents/temp/bool_issue.py", line 7, in <module>
_assert_all_finite(array, False)
File "C:\Users\Shawn\AppData\Local\Programs\Python\Python38\lib\site-packages\sklearn\utils\validation.py", line 103, in _assert_all_finite
if _object_dtype_isnan(X).any():
AttributeError: 'bool' object has no attribute 'any'
Run Code Online (Sandbox Code Playgroud)
经过进一步调查,我发现这是因为有些内容pd.NA进入了我的数据集。
用None作品替换它们就好了!
# For my original pandas DataFrame
X.replace(to_replace=pd.NA, value=None, inplace=True)
Run Code Online (Sandbox Code Playgroud)
根据我的理解(我没有检查,只是猜测),numpy 不会尝试进行元素比较,因为里面有外部对象,所以它会执行数组的整体比较。
另外,围绕面具工作pd.NA似乎很混乱:
>>> array = np.array(['F', 'F', 'M', 'F', 'M', pd.NA, 'F', 'M'], dtype='object')
>>> mask = np.equal(array, np.array(['F', ] * len(array)))
Traceback (most recent call last):
File "C:/Users/Shawn/Documents/temp/bool_issue.py", line 7, in <module>
mask = np.equal(array, np.array(['F', ] * len(array)))
File "pandas\_libs\missing.pyx", line 360, in pandas._libs.missing.NAType.__bool__
TypeError: boolean value of NA is ambiguous
Run Code Online (Sandbox Code Playgroud)
因此,如果您有在 numpy 数组中替换它们的技巧,请分享!
虽然这个问题并不直接与 scikit-learn 相关,而是与 numpy 的工作方式相关,但这就是我找到它的方式,所以无论如何我都会标记它:shrug::)