曲线拟合后,如何让for循环输出预期的浮点型数值?
问题原因与解决方案
问题出在b_new的初始化上:np.arange(len(a_new))创建的是整数类型的numpy数组,当你把浮点计算结果赋值给整数数组元素时,numpy会自动将浮点值截断为整数,导致输出都是整数。
解决办法有两种:
1. 直接初始化浮点类型的b_new
把b_new = np.arange(len(a_new))替换成浮点类型的数组初始化,比如:
b_new = np.zeros(len(a_new), dtype=np.float64) # 全0浮点数组 # 或者 b_new = np.arange(len(a_new), dtype=np.float64) # 浮点类型的序列数组
修改后的完整代码:
from numpy.polynomial import polynomial as P import numpy as np a = np.array([5, 55, 211, 250, 270, 300, 330, 350, 400, 450, 500, 550, 600, 750, 870, 1000]) b = np.array([0.38, 0.96, 1.90, 2.05, 2.13, 2.25, 2.35, 2.42, 2.60, 2.75, 2.90, 3.04, 3.18, 3.65, 4.06, 4.35]) c = P.polyfit(a, b, 2) a_new = np.arange(2000) b_new = np.zeros(len(a_new), dtype=np.float64) # 改为浮点类型数组 for x in range(len(a_new)): b_new[x] = c[0] + c[1] * a_new[x] + c[2] * a_new[x]**2 print(f"{x}, {b_new[x]}")
2. 用numpy内置的多项式求值函数(推荐,更高效)
不需要手动写循环,直接用P.polyval()函数处理整个数组,自动返回浮点结果,代码更简洁且性能更好:
from numpy.polynomial import polynomial as P import numpy as np a = np.array([5, 55, 211, 250, 270, 300, 330, 350, 400, 450, 500, 550, 600, 750, 870, 1000]) b = np.array([0.38, 0.96, 1.90, 2.05, 2.13, 2.25, 2.35, 2.42, 2.60, 2.75, 2.90, 3.04, 3.18, 3.65, 4.06, 4.35]) c = P.polyfit(a, b, 2) a_new = np.arange(2000) b_new = P.polyval(a_new, c) # 直接用polyval计算数组的多项式值 for x in range(len(a_new)): print(f"{x}, {b_new[x]}")
补充说明
numpy数组的类型是固定的,一旦创建就不能随意改变类型(除非显式转换),所以初始化时一定要匹配你需要存储的数据类型。而P.polyval()是专门为多项式求值设计的函数,支持矢量运算,比手动循环效率高很多,尤其当数组很大时优势更明显。
内容的提问来源于stack exchange,提问作者Always Trying
相关产品推荐
相关产品推荐

