You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:08:03