2012-10-19 43 views
3

有时我有一种情况,我想测试一个变量是否为0None或不是。在纯Python,这简直是检查变量是否用Numpy数组定义?

foo == True 

但当foo可能是一个numpy的对象(如numpy.ndarray),这不工作了,我得到的错误:

ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all() 

在这种情况下我想要a.any(),但是这在不可迭代的对象上失败。

当然,我可以明确检查foo0还是None,但我想知道是否有更优雅的方式来做到这一点。

如何检查任意对象(可迭代与否)是否为True

+0

更多Python的,它是'如果foo' - 这将适用于大多数事情。不幸的是,你必须特殊情况'numpy.ndarray'或者比0更复杂的其他类型,None,False,len()== 0等于False。 –

+1

我通常检查numpy对象是None,数组是'None',但是这并不检查零。在这里看到一个类似的问题,http://stackoverflow.com/questions/5086178/python-how-to-check-if-array-is-not-empty – gg349

回答

2

只需使用的np.allnp.any代替.all方法。如果它还不是一个,则np.all将创建一个数组。

+1

只是要知道,这不工作,因为你可能会想对于所有迭代:'np.any(False for _ in range(10))'产生'True'。 (当然,如果这是一个列表理解而不是一个生成器,它将起作用。)基本上,它评估可迭代实例的逻辑真值,而不是从内容中创建数组。你可以用'np.fromiter'解决这个问题,但这是一个额外的步骤。不过,如果你只是想处理大多数情况,那么使用'np.all'等是迄今为止最干净的解决方案。 –

+0

这似乎是一个合适的解决方案,谢谢!发电机异常对我来说不是真正的问题,但很高兴知道有潜在的缺陷。 – Tim

1

我使用的配方是围绕假设变量的存在,在try块之外声明:

try: 
    do_something(foo) 
except NameError: 
    foo = something