我在 Python 中定义了一个函数,它可以正确地用于标量值:
>>> def signo(x):
... if x < 0:
... return -1
... elif x > 0:
... return 1
... else:
... return 0
...
>>> signo(10)
1
>>> signo(-5)
-1
但是当我从 NumPy 传递一个数组时,它失败了ValueError
:
>>> import numpy as np
>>> t = np.arange(-5, 5)
>>> t
array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4])
>>> signo(t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in signo
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
为什么会这样?
在这种情况下,错误消息清楚地解释了问题:“一个以上元素的数组的真值不明确”。目前 Python 必须评估这个条件:
既不能返回也不能返回
True
,False
因为数组中有满足条件的元素,也有不满足条件的元素。这是一个非常典型的问题。假设我们想要另一个数组,与输入的大小相同,有值
True
或者False
取决于对应元素是否满足条件,那么有两种方法可以解决它:1) 在内部实现所有逻辑:必须在循环中对数组的每个元素进行评估。一个实现是这样的:
2)向量化函数,使用
np.vectorize
. 请注意,这是更优雅地处理标量情况的方式:在这个特定问题中,建议使用
.any()
或.all()
不工作,但在另一种情况下,它们可能是有用的功能。