问题描述
我正在制作以下图形:
import matplotlib.pyplot as plt
import numpy as np
import math
def g(x):
return np.exp(-10)*pow(10,x)/math.factorial(x)
x=np.linspace(0,100,100)
plt.plot(x,g(x))
plt.show()
TypeError: only size-1 arrays can be converted to Python scalars
我应该如何解决? 谢谢。
解决方法
数学函数不能在numpy数组上调用,只能在numpy标量上调用。要计算数组的逐元素阶乘,需要scipy.special.factorial
。
如注释中所述,np.linspace(0,100,100)
不是整数。您需要np.linspace(0,101)
来获取0到100之间的整数。由于scipy.special.factorial
依赖于gamma函数,非整数不一定是问题。但是请注意,这些类型的值不是很精确。
要显示曲线,您可能需要使用对数刻度:
import matplotlib.pyplot as plt
import numpy as np
import scipy.special
def g(x):
return np.exp(-10) * pow(10,x) / scipy.special.factorial(x)
x = np.linspace(0,100)
fig,(ax1,ax2) = plt.subplots(ncols=2,figsize=(12,4))
ax1.plot(x,g(x))
ax1.set_title('linear plot')
ax2.plot(x,g(x))
ax2.set_yscale('log')
ax2.set_title('log plot')
plt.show()
,
我已通过from scipy.special import factorial
import matplotlib.pyplot as plt
import numpy as np
from scipy.special import factorial
def g(x):
return np.exp(-10)*pow(10,x)/factorial(x)
x=np.linspace(0,100)
plt.plot(x,g(x))
plt.show()
斯特林近似不是必需的。谢谢。