如何根据另一个numpy数组的条件遍历numpy矩阵并执行对应运算
问题解决方法
错误原因
你代码报错的核心原因是for i in X的遍历逻辑:这里的i是X的每一行向量,不是行的整数索引,所以用Y[i]取值时,相当于把数组类型的i当成索引传入,自然触发类型不匹配的IndexError。
方案1:修改循环实现(可读性高,适合小数据量)
直接遍历行索引,让X和Y的位置一一对应:
# 先初始化一个数组存每个行的计算结果 res = np.zeros(X.shape[0]) for idx in range(X.shape[0]): x_row = X[idx] y_val = Y[idx] if y_val == 1: res[idx] = np.sum(x_row * np.log(w) + (1 - x_row) * np.log(1 - w)) elif y_val == -1: res[idx] = np.sum(x_row * np.log(z) + (1 - x_row) * np.log(1 - z))
补充说明:可以直接用*替代np.multiply,numpy数组会自动按元素相乘,写法更简洁。
方案2:向量化实现(效率更高,推荐大数据量使用)
不用写循环,用numpy的布尔掩码批量处理两类样本:
# 防止log出现无穷大,可加极小的偏移量,不需要可以删掉 eps = 1e-8 # 处理Y=1的样本 mask_pos = Y == 1 pos_res = np.sum(X[mask_pos] * np.log(w + eps) + (1 - X[mask_pos]) * np.log(1 - w + eps), axis=1) # 处理Y=-1的样本 mask_neg = Y == -1 neg_res = np.sum(X[mask_neg] * np.log(z + eps) + (1 - X[mask_neg]) * np.log(1 - z + eps), axis=1) # 如果需要按原顺序合并结果可以用如下写法 res = np.zeros(X.shape[0]) res[mask_pos] = pos_res res[mask_neg] = neg_res
注意事项
- 要保证
w和z的长度和X的列数一致,才能正常按元素相乘 - 如果计算出来的结果需要后续使用,一定要用变量存储,原代码中没有赋值操作,计算结果会直接丢弃
内容的提问来源于stack exchange,提问作者Conweezy
相关产品推荐
相关产品推荐

