为何Scipy quadrature函数对两个标量函数一个正常一个抛出TypeError?
问题:两段标量函数为何一个能正常运行另一个报错?
可正常运行的代码:
f = lambda x : x * 2.0 * pi print(scipy.integrate.quadrature(f, 0.0, 1.0))
报错的代码:
f = lambda x : math.exp(x * 2.0 * pi) print(scipy.integrate.quadrature(f, 0.0, 1.0))
报错信息:
TypeError: only size-1 arrays can be converted to Python scalars
原因与解决方法
核心原因是scipy.integrate.quadrature会传入numpy数组而非单个标量给被积函数,以此实现向量化计算提升效率。
- 第一段代码中的乘法运算
x * 2.0 * pi:当x是numpy数组时,乘法会触发numpy的广播机制,数组内每个元素都会参与计算,因此可以正常运行。 - 第二段代码中的
math.exp:这是Python标准库函数,仅支持单个标量输入,无法处理numpy数组,因此触发类型错误。
解决方法
- 推荐方案:使用numpy的exp函数
numpy的函数原生支持数组输入,完全适配quadrature的向量化计算:
import numpy as np import scipy.integrate f = lambda x : np.exp(x * 2.0 * np.pi) print(scipy.integrate.quadrature(f, 0.0, 1.0))
- 兼容方案:手动处理数组元素
如果必须使用math.exp,可以遍历数组中的每个元素逐一计算:
import math import numpy as np import scipy.integrate f = lambda x : np.array([math.exp(val * 2.0 * math.pi) for val in x]) print(scipy.integrate.quadrature(f, 0.0, 1.0))
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

