import numpy as N
from matplotlib import pylab as plt
def function2(t):
if (t-N.floor(t))<0.5:
return -1
else:
return 1
def function3(t):
if t<=5:
return N.cos(40*N.pi*t)
else:
return 0
x2= N.linspace(0,10,1024)
y2= function2(x2)
x3= N.linspace(0,40,8192)
y3= function3(x3)
plt.plot(x2,y2)
plt.show()
无论我尝试plot(x2,y2)
还是(x3,y3)
,都会显示错误消息,但我可以打印function2
和function3
的任何单个值,而不会出现任何问题。
我被困在这里。提前谢谢。
答案 0 :(得分:0)
你有:
{
[
{"name":"A","number":"12-333-3333"},
{"name":"B","number":"12-4333-54333"},
{"name":"C","number":"12-783-5993"}
]
}
来自该行:
Traceback (most recent call last):
File "b.py", line 16, in <module>
y2= function2(x2)
File "b.py", line 4, in function2
if (t-N.floor(t))<0.5:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
如果if (t-N.floor(t))<0.5:
,您正在执行此操作。你的意图是什么?
如果要检查数组的所有元素&gt; 0.5,你可以:
array < 0.5
答案 1 :(得分:0)
function2
和function3
是标量函数。您需要将它们转换为矢量化的:
x2 = N.linspace(0,10,1024)
y2 = N.vectorize(function2)(x2)
x3 = N.linspace(0,40,8192)
y3 = N.vectorize(function3)(x3)
请参阅numpy.vectorize
。
答案 2 :(得分:0)
你在做什么,正在应用array
比较,它会给你一个True / False数组。因此,您的if
函数同时评估两者。这引起了一个错误。
虽然提出@falsetru的解决方案是可以接受的,但我强烈反对使用vectorize
,因为它增加了不必要的循环。相反,您可以利用numpy的强度来执行上面的简单比较操作。示例:如果a
是数组(a>0)
,则返回带有True
(1)或False
(0)的元素方式布尔数组,稍后可以对其进行操作。您的代码应如下所示:
def function2(t):
return 1-2*(t-N.floor(t)<0.5) # returns 1- 2*True(1)/False(0)
def function3(t):
return (t<=5)*N.cos(40*pi*t) # returns 0 if t<=5 evaluates to False
x2= N.linspace(0,10,1024)
y2= function2(x2)
x3= np.linspace(0,40,8192)
y3= function3(x3)
plt.plot(x2,y2)
ylim(-2,2)
plt.show()