我的目标是用两个变量t和x绘制一个函数。 如果为0,我们将0分配给x
import matplotlib.pyplot as plt
import numpy as np
t=np.linspace(0,5,100)
def x(i):
if i <= 1:
j = 1
else :
j = 0
return j
y = 8*x(t)-4*x(t/2)-3*x(t*8)
plt.plot(t,y)
plt.ylabel('y')
plt.xlabel('t')
plt.show()
它返回错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
答案 0 :(得分:3)
你不能在numpy数组上使用经典if
,至少不是在逐点意义上。这不是问题,因为您可以对数组执行布尔运算:
def x(i):
j = (i<=1)*1.
return j
答案 1 :(得分:3)
您的函数x
无法处理数组输入(因为比较操作)。您可以在此函数中创建一个临时数组,以根据需要设置值:
def x(t):
tmp = np.zeros_like(t)
tmp[t <= 1] = 1
return tmp
答案 2 :(得分:1)
您可以在分配t
时循环遍历y
中的值,因为您的函数x
仅将一个数字作为其参数。试试这个:
y = np.array([8*x(tt)-4*x(tt/2)-3*x(tt*8) for tt in t])
print y
array([ 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
-4, -4, -4, -4, -4, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
矢量化答案(例如@Christoph和@xnx)是更好的方法,但
答案 3 :(得分:1)
你想用该代码做什么?看看t
是一个np.array然后你用它作为单个数字元素智能操作符在这种情况下不起作用你可能更喜欢使用如下的循环:
import matplotlib.pyplot as plt
import numpy as np
t=np.linspace(0,5,100)
def x(i):
if i <= 1:
j = 1
else :
j = 0
return j
y = []
for i in t:
y.append(8*x(i)-4*x(i/2)-3*x(i*8))
# or using list comprehensions
y = [8*x(i)-4*x(i/2)-3*x(i*8) for i in t]
plt.plot(t,y)
plt.ylabel('y')
plt.xlabel('t')
plt.show()