numpy:FutureWarning:元素比较失败
Posted
技术标签:
【中文标题】numpy:FutureWarning:元素比较失败【英文标题】:numpy: FutureWarning: elementwise comparison failed 【发布时间】:2021-03-04 21:14:41 【问题描述】:对于此 SO 帖子 FutureWarning: elementwise comparison failed; returning scalar, but in the future will perform elementwise comparison 中描述的问题,numpy 中是否有任何解决方案。我的 numpy 版本是 1.19.1 并使用 python 3.8.5。
a = np.array(['aug', False, False, False])
a == 'aug'
array([ True, False, False, False])
但是:
a == False
<ipython-input-88-f9ff25cfe387>:1: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
a == False
与 np.nan 相同:
a = array(['aug', np.nan, np.nan, np.nan])
a == 'aug'
array([ True, False, False, False])
但是:
a == np.nan
<ipython-input-1236-9224919e9367>:1: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
a == np.nan
False
【问题讨论】:
试试a[:,None,None] == 'False'
a
是字符串 dtype。你为什么要测试 bool 对象,False
或 float 对象nan
反对呢?字符串比较返回一个匹配形状的布尔数组(为什么没有给问题增加任何东西的额外维度?)。失败的比较返回带有警告的标量 False。您的 a
数组不等于 False
或 nan
。
@hpaulj 我清理了我原来的问题。目前尚不清楚为什么 numpy 无法区分具有字符串元素的数组中的布尔值或 np.nan。
您还没有费心查看您的 a
数组,是吗?
【参考方案1】:
创建后查看数组:
In [58]: a = np.array(['aug', False, False, False])
...:
In [59]: a
Out[59]: array(['aug', 'False', 'False', 'False'], dtype='<U5')
In [60]: a == 'aug'
Out[60]: array([ True, False, False, False])
In [61]: a == False
<ipython-input-61-f9ff25cfe387>:1: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
a == False
Out[61]: False
In [62]: a == 'False'
Out[62]: array([False, True, True, True])
这是一个字符串 dtype 数组。测试匹配字符串有效。测试非字符串值是错误的。
nan
也一样:
In [64]: a = np.array(['aug', np.nan, np.nan, np.nan])
In [65]: a
Out[65]: array(['aug', 'nan', 'nan', 'nan'], dtype='<U3')
In [66]: a == 'nan'
Out[66]: array([False, True, True, True])
如果您必须混合类型 - 字符串、布尔值、浮点数,您可以指定 object
dtype。这使得数组更像列表。
In [67]: a = np.array(['aug', False, False, False], object)
In [68]: a
Out[68]: array(['aug', False, False, False], dtype=object)
In [69]: a == 'aug'
Out[69]: array([ True, False, False, False])
In [70]: a == False
Out[70]: array([False, True, True, True])
In [71]: a == True
Out[71]: array([False, False, False, False])
但这对np.nan
没有帮助。 nan
是一种特殊的浮点数,它不等于任何东西,甚至不等于它自己。
In [72]: a = np.array(['aug', np.nan, np.nan, np.nan], object)
In [73]: a
Out[73]: array(['aug', nan, nan, nan], dtype=object)
In [74]: a=='aug'
Out[74]: array([ True, False, False, False])
In [75]: a == np.nan
Out[75]: array([False, False, False, False])
isnan
是测试nan
的正确方法,但它仅适用于 float dtype 数组:
In [76]: np.isnan(a)
Traceback (most recent call last):
File "<ipython-input-76-da86cb21b8a4>", line 1, in <module>
np.isnan(a)
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
【讨论】:
这回答了我所有的问题。谢谢你。所以 nan 是一种特殊的类型,它甚至不能与 object dtype 一起使用。好的,让我重新考虑我的数据,看看我是否可以重新构建事物以不混合 dtypes。感谢您对此的帮助。泰。以上是关于numpy:FutureWarning:元素比较失败的主要内容,如果未能解决你的问题,请参考以下文章
为啥我得到这个错误结果=方法(y)FutureWarning:元素比较失败;而是返回标量
Python loc + isin 返回 FutureWarning(元素比较失败)
FutureWarning:元素比较失败;从熊猫数据框中删除所有行时
FutureWarning:不推荐将 issubdtype 的第二个参数从“float”转换为“np.floating”