2016-02-03 17 views
1

嵌入我想要做这样的事情:绘制拉姆达与如果在Python语句中使用pyplot

import numpy as np 
import matplotlib.pyplot as plt 
xpts = np.linspace(0, 100, 1000) 
test = lambda x: 0.5 if x > 66 else 1.0 
plt.plot(xpts, test(xpts)) 

,但我得到的错误:

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

在另一方面,我能要做到:

print(test(50), test(70)) 

1.0 0.5

这是怎么回事有没有解决方案?

回答

2

您不能将数组转换为bool如果它包含多个元素:

In [21]: bool(np.array([1])) 
Out[21]: True 

In [22]: bool(np.array([1, 2])) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-22-5ba97928842c> in <module>() 
----> 1 bool(np.array([1, 2])) 

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

你,或许,想申请test功能的阵列中的每个元素:

In [23]: plt.plot(xpts, [test(x) for x in xpts]) 
Out[23]: [<matplotlib.lines.Line2D at 0x7fa560efeeb8>] 

你也可能会创建函数的矢量化版本,并将其应用于阵列,而无需列表理解:

In [24]: test_v = np.vectorize(test) 

In [25]: plt.plot(xpts, test_v(xpts)) 
Out[25]: [<matplotlib.lines.Line2D at 0x7fa560f19080>] 
1

Python列表不允许您执行列表比较。所以你不能,例如,做范围(10)> 10.相反,你可以将输入转换为一个numpy数组并执行范围检查。 T

import numpy as np 
import matplotlib.pyplot as plt 
xpts = np.linspace(0, 100, 1000) 
test = lambda x: (np.array(x) <= 66)*.5 + .5 
print xpts, test(xpts) 
plt.plot(xpts, test(xpts)) 
plt.show()