使用:^15.10f格式化打印F(Rr)报numpy.ndarray类TypeError如何解决
报错根因
- 该报错的直接触发原因是:你导入并使用的
numpy.exp属于NumPy的通用ufunc接口,哪怕传入Python原生浮点数做标量计算,返回值也大概率是numpy.ndarray类型(通常是0维数组);而NumPy的ndarray类型并没有实现兼容浮点数格式说明符(如^15.10f)的__format__魔术方法,当你将数组值直接传入str.format()的占位符、试图用浮点数格式约束它时,就会抛出类型不匹配的错误。 - 附带你现有代码中存在的两处逻辑错误,会导致计算逻辑完全失效:
- 定义函数
F(n)时,函数体内错将参数名n写为未定义的变量x,运行时会直接触发NameError - 根值搜索的符号判断逻辑错误:你写的
F(Ri).all() * F(Rr).all()中,.all()是NumPy用来判断数组所有元素是否为真值的聚合方法,调用后会返回布尔值而非函数的计算数值,用这个结果做乘积符号判断会完全失效。
- 定义函数
正确实现方式
要实现对F(Rr)按宽度15、居中对齐、保留10位小数的格式化,最简洁稳定的方案是:
- 把NumPy计算得到的数组类型结果,用
float()强制转换为Python原生浮点数,原生浮点数完全兼容标准的字符串格式化语法 - 修正占位符的对应关系,你原本的代码漏了给
F(Rr)分配对应的格式说明符,错把10位小数的格式给了相对误差Er
具体修正后的可运行参考代码如下:
from numpy import exp Ri = 15 Rr = 31/2 Rs = 16 i = 0 Er = 0.0 Rra = 0.0 # 修正函数参数名的笔误 def F(n): return 745 * 1 - exp(-n / 10) - 49 * n # 计算相对误差的函数 def error(Rra, Rrn): Erel = abs((Rrn - Rra) / Rrn) * 100 return Erel print('{:^15}{:^15}{:^15}{:^15}{:^15}{:^15}'.format('# iter', 'Ri', 'Rs', 'Rr', 'F(Rr)', 'Erel(%)')) while i < 10: Er = error(Rra, Rr) Rra = Rr # 记录上一次的Rr值,用于计算相对误差 # 修正符号判断逻辑,转原生浮点数后再做数值比较 f_Ri = float(F(Ri)) f_Rr = float(F(Rr)) if f_Ri * f_Rr < 0: Rs = Rr elif f_Ri * f_Rr > 0: Ri = Rr elif abs(f_Rr) < 1e-12: # 浮点数不要直接判等,加精度阈值判断 print('La raiz es', Rr) break Rr = (Ri + Rs) / 2 i = i + 1 if i == 1: # 给F(Rr)分配10位小数、居中宽度15的格式 print('{:^15}{:^15.6f}{:^15.6f}{:^15.6f}{:^15.10f}'.format(i - 1, Ri, Rs, Rr, float(F(Rr)))) elif i > 1: print('{:^15}{:^15.6f}{:^15.6f}{:^15.6f}{:^15.10f}{:^15.4f}'.format(i - 1, Ri, Rs, Rr, float(F(Rr)), Er))
其他可选实现方案
如果你不想做类型转换,也可以用NumPy自带的格式化接口处理单元素数组:
- 先用
np.format_float_positional()把数组值转成指定小数位的字符串 - 再调用字符串的
center(15)方法实现居中对齐
不过这种方式比直接转原生浮点数繁琐,仅适合需要保留NumPy高精度数值特性的场景,常规标量计算不需要这么写。
内容的提问来源于stack exchange,提问作者Fernando Magyar
相关产品推荐
相关产品推荐

