如果a 是list 而不是ndarray,这就是你得到的错误:
>>> a = [1,2,7]
>>> np.piecewise(a, [a == 1, a > 1, a > 4], [lambda x: 100*x, lambda x: x**2, lambda x: x])
Traceback (most recent call last):
File "<ipython-input-18-03e300b14962>", line 1, in <module>
np.piecewise(a, [a == 1, a > 1, a > 4], [lambda x: 100*x, lambda x: x**2, lambda x: x])
File "/usr/local/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 693, in piecewise
"function list and condition list must be the same")
ValueError: function list and condition list must be the same
>>> a = np.array(a)
>>> np.piecewise(a, [a == 1, a > 1, a > 4], [lambda x: 100*x, lambda x: x**2, lambda x: x])
array([100, 4, 7])
发生这种情况是因为如果 a 是一个列表,那么向量比较的行为就不会像预期的那样:
>>> a = [1,2,7]
>>> [a == 1, a > 1, a > 4]
[False, True, True]
这些行在np.piecewise
if isscalar(condlist) or \
not (isinstance(condlist[0], list) or
isinstance(condlist[0], ndarray)):
condlist = [condlist]
condlist = [asarray(c, dtype=bool) for c in condlist]
意味着您最终会认为条件列表实际上看起来像
[array([False, True, True], dtype=bool)]
这是一个长度为 1 的列表。
[哎呀——我刚刚注意到我的条件并不是相互排斥的。哦,好吧,反正解释是怎么回事也没关系。]