【问题标题】:Checking if variable is zero for both scalar and array检查标量和数组的变量是否为零
【发布时间】:2021-05-10 18:04:55
【问题描述】:

假设我有一个变量x,它可以是标量或一维对象,如列表、numpy ndarray 或 pandas 系列等。我想检查它是否是标量并且在数值上等于 0(a仅包含零的类似列表的对象应该产生错误,因为不是标量)。这样做的最简洁和pythonic的方式是什么?

一个简单的:

if x == 0:
    print("scalar == 0 detected")

不起作用,因为 numpy 数组按元素进行比较(并抛出 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

【问题讨论】:

  • 使用isinstance并对x的每种可能类型进行适当的检查
  • 首先如何将x 设置为两种截然不同的类型之一?
  • @chepner 该案例出现在一个包含许多不同类型的列表的循环中。
  • @DeepSpace 我想知道是否有标准的“涵盖所有情况”的解决方案,但使用了 np.isscalar 检查。

标签: python


【解决方案1】:

如果x 是您可以使用的“列表”

a = [0, 0, 0]
all(x==0 for x in a)
True

如果是np.arraypd.DataFrame

import numpy as np
a = np.array([0 ,0 ,0])
(a==0).all()
True

如果您想要单一解决方案,您可以将输入转换为 np.array 并使用 numpy 版本 (np.array(a)==0).all()

这很优雅,但您需要将转换“支付”到numpy。 如果您真的关心性能并且您的大多数用例都是标量和短列表,那么如果您想“支付”这种转换开销,您可能需要三思而后行。

a=0
(np.array(a)==0).all()
True

a=[0, 0, 0]
(np.array(a)==0).all()
True

a = np.array([0, 0, 0])
(np.array(a)==0).all()
True

a = pd.DataFrame([0, 0, 0])
(np.array(a)==0).all()
True

【讨论】:

  • 感谢您的回答,希望对其他人有所帮助!我的问题是关于一维对象(即使只包含 0)评估为假的情况。
【解决方案2】:

我找到的最佳解决方案是

import numpy as np

if np.isscalar(x) and x == 0:

我在这里发布它以防它帮助任何人,但如果有更简洁的方法,我仍然感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 2012-05-23
    • 1970-01-01
    • 2016-03-28
    • 2010-09-20
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多