np.where函数执行结果不一致问题排查求助
问题原因分析与解决办法
核心原因:numpy广播规则不兼容
你遇到的问题本质是numpy的广播机制要求np.where的两个结果参数(then和else)必须形状兼容,否则会按更严格的形状输出:
- 第一种场景里,
1和2都是标量,和条件的标量布尔值(False)完全匹配,所以np.where直接返回标量2对应的数组array(2)。 - 第二种场景里,
re.findall(...)返回的空列表[]会被numpy自动转为形状为(0,)的一维空数组;而你传入的else参数是标量2。此时numpy会把标量2广播成和空数组相同的(0,)形状,最终输出空数组array([], dtype=float64)——因为广播后的else值也是空数组,自然没有元素可以返回。
解决办法
要让np.where在条件不满足时返回标量2,需要让then参数的形状和标量兼容,或者提前处理then的结果:
方法1:给then分支的空结果设默认标量
如果re.findall返回空列表时,你希望then分支对应一个标量值,可以先判断结果:
match_result = re.findall('|'.join(aSecs), a['Description'].upper()) then_val = match_result[0] if match_result else 0 # 空时设默认标量,可按需调整 result = np.where(a['Security']=='CASH', then_val, 2)
方法2:强制将then结果转为标量形状
因为你处理的是单行数据,条件是标量布尔值,可以把then的结果转为标量或形状为()的数组:
then_arr = np.array(re.findall('|'.join(aSecs), a['Description'].upper())) # 空数组时转成标量(比如NaN),非空时取第一个元素(按需调整) then_val = then_arr.item() if then_arr.size else np.nan result = np.where(a['Security']=='CASH', then_val, 2)
方法3:用原生if-else替代(更直观)
既然处理的是单行数据,直接用Python原生条件判断可以完全规避numpy广播问题:
if a['Security'] == 'CASH': result = re.findall('|'.join(aSecs), a['Description'].upper()) else: result = 2
内容的提问来源于stack exchange,提问作者wbm
相关产品推荐
相关产品推荐

