我该如何解决?只能将size-1数组转换为Python标量

问题描述

我正在制作以下图形:

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

example plot

,

我已通过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()

斯特林近似不是必需的。谢谢。

Distribution