ValueError的原因:不允许负尺寸?

时间:2017-06-13 09:51:21

标签: python-3.x matplotlib

我一直试图绘制下面定义的函数的输出,但是无法获得输出。我尝试了几件事,但每次都会遇到不同的错误。如果有人可以帮助我解决我做错了什么,我将不胜感激。

import matplotlib.pyplot as plt
%matplotlib inline
import math
import sympy as sym
x = sym.symbols('x',positive = True)
lambd = 4
a= 3
def f(x):
    return lambd**a * x**(a-1) * sym.exp(-lambd*x) / math.factorial(a-1)
x1 = np.linspace(0,1,10)
plt.plot(x1,f(x1))

如果我将x1更改为np.linspace(0,1,100),则错误为
 "ValueError: sequence too large; cannot be greater than 32"

可能是什么原因?对此的一些指导将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

您正在将一个numpy数组x1传递给函数f。这个函数里面有sympy.exp()的问题,它不了解如何处理数组,因为它只适用于符号和数字。

最简单的方法是使用numpy.exp代替。

import matplotlib.pyplot as plt
import numpy as np
import math

lambd = 4
a= 3

def f(x):
    return lambd**a * x**(a-1) * np.exp(-lambd*x) / math.factorial(a-1)

x1 = np.linspace(0,1,10)
plt.plot(x1,f(x1))

plt.show()

enter image description here

如果由于某种原因,您需要使用仅适用于单个数字而不是数组的函数,则可以使用numpy.vectorize将函数转换为以元素方式计算输入数组的函数。

import matplotlib.pyplot as plt
import sympy as sym
import numpy as np
import math

lambd = 4
a= 3

def f(x):
    return lambd**a * x**(a-1) * sym.exp(-lambd*x) / math.factorial(a-1)

fv = np.vectorize(f)

x1 = np.linspace(0,1,10)
plt.plot(x1,fv(x1))

plt.show()