我该如何解决?只有大小为 1 的数组可以转换为 Python 标量

How should I fix it? Only size-1 arrays can be converted to Python scalars

我正在制作以下图表:

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 标量上调用。要计算数组的 element-wise 阶乘,需要 scipy.special.factorial

如评论中所述,np.linspace(0, 100, 100) 不是整数。您需要 np.linspace(0, 100, 101) 来获取从 0 到 100 的整数。由于 scipy.special.factorial 依赖于伽玛函数,因此 non-integers 不一定是问题。但是请注意,这些类型的值不是很精确。

要显示曲线,您可能需要使用对数刻度:

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

不需要斯特林近似。谢谢。