Python代码报仅size-1数组可转Python标量错误的调试咨询
错误产生原因
这个错误的触发点为代码中的math.exp((-n)*Ts):n是np.linspace生成的numpy数组,因此(-n)*Ts的计算结果也是数组类型。Python标准库math模块的所有函数仅支持接收*单个标量值(单个整数、浮点数)*作为输入,不支持直接传入数组做批量运算,因此传入数组时就会抛出该错误。
另外代码还存在一处潜在问题:如果输入的Ts是大于1的整数,1/Ts的计算结果会是小于1的浮点数,直接转int会得到0,后续np.linspace传入长度为0的参数也会抛出异常。
解决方法
- 将
math.exp替换为numpy自带的向量化指数函数np.exp,numpy的数学函数原生支持对数组的每个元素做批量运算,无需额外循环。 - 补充
fs参数的合法性校验,避免出现采样率为0的异常情况。
修改后可正常运行的代码如下:
import numpy as np import matplotlib.pyplot as plt f = input("Enter value of f: ") Ts = input("Enter value of Ts: ") f = int(f) Ts = int(Ts) fs = 1 / Ts fs = int(fs) # 校验采样率合法性 if fs <= 0: raise ValueError("Ts取值过大导致采样率不能小于等于0,请调整Ts输入") n = np.linspace(-1, 1, fs) x = np.cos(2 * np.pi * f * n * Ts) * (np.exp((-n) * Ts)) plt.scatter(n, x) plt.show()
同类错误排查调试思路
- 首先通过报错栈定位到具体报错的代码行,检查该行使用的函数是否仅支持标量输入,传入的参数是否为numpy数组
- 所有对numpy数组做批量数学运算的场景,优先使用
np.开头的numpy原生向量化函数,不要使用标准库math模块的函数 - 如果必须使用自定义的仅支持标量的函数处理数组,可以用
np.vectorize包装函数,或者遍历数组元素逐一计算后再转回numpy数组 - 遇到参数类型不匹配的报错时,可以先打印对应参数的类型(用
type()函数)、形状(numpy数组用.shape属性),确认是否符合函数的输入要求
内容的提问来源于stack exchange,提问作者Nirmal Moray
相关产品推荐
相关产品推荐

