关于python:np数组作为可选参数

np array as optional arguments

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

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

如果没有传递任何可选参数,则可以按预期工作。如果我通过了一个np.array,那么我就得到了错误。

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

是否有更紧凑的方法来检查是否通过了额外的参数?我想我可以安全地假设,如果它们通过,那么它们将是np.array


首先,您可以假设它们是正确的类型(特别是如果您是唯一使用代码的人)。只需将其添加到文档中即可。参数类型检查python(接受的答案甚至在解释duck输入时叹息)

您得到的异常是常见的,并且已经结束了,就像valueerror:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()。

在你的情况下,

1
if this is not None and that is not None

会实现你想要的。问题不是"和",而是数组

1
2
     if np.array([True, False]):
         foo()

从numpy的角度来看是不明确的,因为数组的某些值是真的,但不是所有值…那么它应该返回什么呢?。此行为与列表的行为明显不一致(我相信您当前的代码遵循这样的建议方式,检查列表是否为空)。

如果你想一个JavaESK重载你的函数,取决于有多少参数被传递,你就没有足够的思考。您当然可以将该条件之后的任何内容发送给另一个函数,以"简洁"地处理它。以下也可以

1
2
3
4
5
6
7
8
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

正如你在侧边栏看到的,这个ValueError以前出现过很多次。

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

我来举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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,但是对于数组,它们为数组的每个元素返回一个值。

1
2
3
4
5
6
7
8
9
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()

在你的函数中,如果你不给f2个或更多的参数,thisthat将有值None。使用is Noneis not None进行测试的安全方法:

1
2
3
4
def f(some_stuff, this=None, that=None):
    ...do something...
    if this is not None and that is not None:
       perform_the_task()