定义内容时编码问题,但无法绘制它们

时间:2015-09-23 02:33:43

标签: python numpy plot

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),都会显示错误消息,但我可以打印function2function3的任何单个值,而不会出现任何问题。

我被困在这里。提前谢谢。

3 个答案:

答案 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)

function2function3是标量函数。您需要将它们转换为矢量化的:

x2 = N.linspace(0,10,1024)
y2 = N.vectorize(function2)(x2)

x3 = N.linspace(0,40,8192)
y3 = N.vectorize(function3)(x3)

请参阅numpy.vectorize

enter image description here

答案 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()