遍历向量与矩阵返回单个值时出现数组真值歧义报错如何解决?
问题原因及解决方案
核心报错原因
触发报错的直接原因有三个:
- 变量书写错误:从报错栈可以看到,实际运行的代码中是
b += ys而非你示例里写的b += j:ys是长度为100的一维数组,执行这行后b会从单个浮点数变为形状(100,)的数组,后续计算w.T @ i + b时,标量加数组会触发广播机制,最终j * (w.T @ i + b) <=0的计算结果是长度100的布尔数组,放到if判断中自然会报「数组的真值不明确」的错误。 - 循环逻辑错误:感知机的遍历逻辑是每个特征样本对应一个标签,你写的嵌套循环
for i in xs: for j in ys会让每个样本和所有标签挨个配对计算,完全不符合算法逻辑,也会大幅提升维度异常的概率。 - 语法错误:
if m==0: break的缩进位置错误,这行必须放到while循环内部,否则while会成为死循环永远无法退出;同时函数定义缺少参数,你实际调用的是perceptron(xs,ys),但你定义的函数名是function且未声明入参,本身也无法正常调用。
单独测试未报错的原因
你在函数外测试时使用的是ys[0]和xs[0]配对,没有执行错误的b += ys代码,b全程为单个浮点数,所以计算结果是标量,不会触发维度报错。
修正后可运行代码
import numpy as np # 此处按感知机标准更新规则实现function2,你可以替换为自己的逻辑 def function2(i, j, w): return j * i def perceptron(xs, ys): n, d = xs.shape w = np.zeros(d) b = 0.0 while True: m = 0 # 用zip同时遍历配对的样本和标签,不要嵌套循环 for i, j in zip(xs, ys): if j * (w.T @ i + b) <= 0: w += function2(i,j,w) b += j m += 1 # 缩进调整到while循环内部 if m == 0: break return (w,b) # 测试代码 N = 100 d = 10 xs = np.random.rand(N,d) w_true = np.random.rand(1,d) ys = np.sign(w_true.dot(xs.T))[0] w, b = perceptron(xs,ys)
内容的提问来源于stack exchange,提问作者Conweezy
相关产品推荐
相关产品推荐

