numpy.where多条件使用报错:丹麦评分制成绩四舍五入实现求助
修复NumPy多条件
where语句的问题 嘿,我来帮你搞定这个问题!你遇到的核心问题是在NumPy数组的多条件判断里误用了Python原生的and关键字——这玩意儿只能处理单个布尔值,而NumPy的条件判断返回的是布尔数组,得用NumPy专门的逐元素逻辑运算符才行。
问题根源
Python的and是标量逻辑运算符,它要求两边都是单个True/False值;但当你对NumPy数组做grades >=1 and grades <3这种判断时,两边返回的是布尔数组(比如array([[False, False, True, True], ...])),这时候and就会报错,因为它不知道怎么处理数组级别的逻辑判断。
修正后的代码
我们需要把and换成NumPy的逐元素逻辑与运算符&,同时给每个独立条件加上括号(避免运算符优先级坑),还要注意每次where操作都要基于上一步更新后的结果(不然前面的修正会被覆盖):
import numpy as np # 原始成绩数组 grades = np.array([[-3,-2,-1,0],[1,2,3,4],[5,6,7,8],[9,10,11,12]]) # 逐步应用丹麦评分制的四舍五入规则 gradesrounded = np.where(grades < -1.5, -3, grades) gradesrounded = np.where((-1.5 <= gradesrounded) & (gradesrounded < 1), 0, gradesrounded) gradesrounded = np.where((gradesrounded >= 1) & (gradesrounded < 3), 2, gradesrounded) gradesrounded = np.where((gradesrounded >= 3) & (gradesrounded < 5.5), 4, gradesrounded) gradesrounded = np.where((gradesrounded >= 5.5) & (gradesrounded < 8.5), 7, gradesrounded) gradesrounded = np.where((gradesrounded >= 8.5) & (gradesrounded < 11), 10, gradesrounded) gradesrounded = np.where(gradesrounded >= 11, 12, gradesrounded) print(gradesrounded)
运行这段代码,你会得到正确的四舍五入结果:
[[-3 -3 0 0] [ 2 2 4 4] [ 7 7 7 7] [10 10 12 12]]
更简洁的写法:用np.select
如果觉得多次where有点繁琐,推荐用np.select一次性处理所有条件,代码可读性更强:
import numpy as np grades = np.array([[-3,-2,-1,0],[1,2,3,4],[5,6,7,8],[9,10,11,12]]) # 定义所有判断条件 conditions = [ grades < -1.5, (-1.5 <= grades) & (grades < 1), (grades >= 1) & (grades < 3), (grades >= 3) & (grades < 5.5), (grades >= 5.5) & (grades < 8.5), (grades >= 8.5) & (grades < 11), grades >= 11 ] # 对应每个条件的评分结果 choices = [-3, 0, 2, 4, 7, 10, 12] # 一次性生成结果 gradesrounded = np.select(conditions, choices) print(gradesrounded)
这个方法把所有规则集中在一起,后续修改评分标准也更方便。
内容的提问来源于stack exchange,提问作者Matt Winther
相关产品推荐
相关产品推荐

