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 数组不等于 Falsenan @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

FutureWarning:不推荐将 issubdtype 的第二个参数从“float”转换为“np.floating”

pandas 错误提醒:FutureWarning: elementwise comparison failed;