np数组作为可选参数

时间:2015-11-13 01:16:10

标签: python arrays numpy

我有一个可以接受两个可选np.array作为参数的函数。如果两个都被传递,该函数应该执行一些任务。

def f(some_stuff, this=None, that=None):
    ...do something...
    if this and that:
       perform_the_task()

如果没有传递任何可选参数,这将按预期工作。如果我传递np.array,那么我会得到错误

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

是否有更紧凑的方法来检查额外的args是否通过?我想我可以放心地假设如果它们被传递,那么它们将是np.array

2 个答案:

答案 0 :(得分:5)

首先,可以假设它们是正确的类型(特别是如果您是唯一使用该代码的人)。只需将其添加到文档中即可。 Type checking of arguments Python(接受的答案甚至在他们解释鸭子打字时叹了口气)

您获得的例外情况很常见且完全是SO,例如ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

在你的情况下,

if this is not None and that is not None

将完成你想要的。问题不在于"和",而在于数组的事实

     if np.array([True, False]):
         foo()
从numpy的角度来看,

是模棱两可的,因为数组值的某些是真的,但不是全部......所以应该返回什么? 。此行为与列表的行为明显不一致(我相信您当前的代码遵循SO推荐的检查列表是无或空的方式)

如果您正在考虑使用Java-esk的方式来重载您的函数,具体取决于传递了多少参数,那么您就不会考虑太多。您当然可以将有条件的任何内容发送到另一个函数,以简明扼要地"处理它。以下也没关系

def f(some_stuff, this=None, that=None):
    ...do something...

       perform_the_task(this,that)

def perform_the_task(this,that):
    if this is None or that is None: return
    raise NotImplementedException

答案 1 :(得分:3)

正如您在侧边栏中看到的那样ValueError之前出现过很多次。

问题的核心是numpy数组可以返回多个真值,而许多Python操作只需要一个。

我将说明:

In [140]: this=None

In [141]: if this:print 'yes'

In [142]: if this is None: print 'yes'
yes

In [143]: this=np.array([1,2,3])

In [144]: if this: print 'yes'
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [145]: if this is None: print 'yes'

In [146]: this and this
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [147]: [1,2,3] is None
Out[147]: False
In [148]: this is None
Out[148]: False

In [149]: [1,2,3]==3    # one value
Out[149]: False     
In [150]: this == 3    # multiple values
Out[150]: array([False, False,  True], dtype=bool)

not等逻辑操作通常会返回一个简单的True / False,但对于数组,它们会为数组的每个元素返回一个值。

In [151]: not [1,2,3]
Out[151]: False

In [152]: not None
Out[152]: True

In [153]: not this
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

在您的函数中,如果您不提供f个或多个参数,thisthat将具有值None。使用is Noneis not None

进行测试的安全方法
def f(some_stuff, this=None, that=None):
    ...do something...
    if this is not None and that is not None:
       perform_the_task()