Python报错:无法将序列与numpy.float64类型非整数相乘,求预测值
解决线性回归代码中的TypeError问题
问题原因
代码执行时触发 TypeError: can't multiply sequence by non-int of type 'numpy.float64',核心原因是Python原生列表无法与numpy浮点数类型直接进行逐元素乘法。在计算预测值 yp=a*X+b 时,X 是普通列表,a 是numpy计算出的float64类型,两者运算逻辑不兼容。
修正方案
将列表 X 转换为numpy数组,使其支持向量运算,有两种实现方式:
方式1:定义时直接使用numpy数组
修改初始的X、Y定义,直接用numpy数组替代原生列表:
import numpy as np import matplotlib.pyplot as plt X = np.array([5, 15, 25, 35, 45, 55]) Y = np.array([5, 20, 14, 32, 22, 38]) plt.scatter(X, Y) xm = np.mean(X) ym = np.mean(Y) num = 0 den = 0 for i in range(len(X)): num += (X[i] - xm) * (Y[i] - ym) den += (X[i] - xm) ** 2 a = num / den b = ym - a * xm print(a, b) yp = a * X + b # numpy数组支持与标量的逐元素运算 plt.scatter(X, Y) plt.plot(X, yp, 'r') plt.show() # 显式调用show()确保图像正常显示
方式2:计算预测值前转换为numpy数组
保留原列表定义,仅在计算预测值时临时转换:
import numpy as np import matplotlib.pyplot as plt X = [5, 15, 25, 35, 45, 55] Y = [5, 20, 14, 32, 22, 38] plt.scatter(X, Y) xm = np.mean(X) ym = np.mean(Y) num = 0 den = 0 for i in range(len(X)): num += (X[i] - xm) * (Y[i] - ym) den += (X[i] - xm) ** 2 a = num / den b = ym - a * xm print(a, b) X_arr = np.array(X) yp = a * X_arr + b # 用转换后的numpy数组执行运算 plt.scatter(X, Y) plt.plot(X_arr, yp, 'r') plt.show()
补充说明
- 转换为numpy数组后,
a * X会自动触发广播运算,即对数组中的每个元素单独乘以a,再加上b,最终得到对应长度的预测值数组。 - 代码末尾的
plt.show()是必要的,否则matplotlib生成的图像可能无法在窗口中显示。
内容的提问来源于stack exchange,提问作者pumpkin
相关产品推荐
相关产品推荐

