Python通过指定索引列表检查numpy二维数组元素满足条件的实现方法
报错原因与解决方案
报错原因解释
你使用numpy数组的多索引取值特性,studentId[lst]会返回一个长度和lst一致的numpy子数组,和40做比较后得到的是一个布尔数组(比如[False, True])。Python的if条件需要接收单个布尔值,无法直接判断一组布尔值的真假,因此抛出该歧义错误。
你需要所有指定索引的成绩都≥40,刚好符合numpy提供的all()方法的作用:判断布尔数组中所有元素是否都为True。
修正后的完整代码
import numpy as np marks = np.array([[66, 26, 54, 80, 56, 42, 56, 60], [34, 63, 90, 98, 78, 65, 45, 54], [94, 87, 92, 80, 79, 90, 98, 89]]) def canGraduate(arr, sNum, compulsoryModules): studentId = arr[sNum] passedCompulsoryModule = False passedModuleCounter = 0 # 核心修改:用.all()判断所有必修课成绩都达标 if (studentId[compulsoryModules] >= 40).all(): passedCompulsoryModule = True for element in studentId: if element >= 40: passedModuleCounter += 1 if passedModuleCounter >= 3 and passedCompulsoryModule: print(f'Student has passed {passedModuleCounter} modules and both compulsory modules. They have passed.') else: print("Student has failed the course.") # 调用时传入自定义的必修课索引列表 compulsoryModules = [1,4] canGraduate(marks, 0, compulsoryModules) canGraduate(marks, 1, compulsoryModules) canGraduate(marks, 2, compulsoryModules)
运行结果
和原有代码的输出完全一致:
Student has failed the course. Student has passed 7 modules and both compulsory modules. They have passed. Student has passed 8 modules and both compulsory modules. They have passed.
拓展思路
如果后续需要修改规则为「任意一门必修课达标即可」,把all()替换为any()即可,无需修改其他逻辑。
如果不想依赖numpy的特性,也可以用原生Python循环实现校验:
passedCompulsoryModule = all(studentId[idx] >=40 for idx in compulsoryModules)
内容的提问来源于stack exchange,提问作者Tai Ozyer
相关产品推荐
相关产品推荐

