Python for循环处理ndarray分类时所有值均被设为1,不符合预期
问题原因
你的条件判断存在语法逻辑错误:Python 中or运算符连接的是两个独立的布尔表达式,单独的非空字符串会被判定为布尔值True。你写的if data[k, 1] == ' Car' or ' Motorcycle' or ' Bicycle' or ' Pedestrian' 实际执行逻辑等价于:
if (data[k, 1] == ' Car') or (bool(' Motorcycle')) or (bool(' Bicycle')) or (bool(' Pedestrian'))
后三个非空字符串的布尔值永远为True,因此整个if判断结果永远为真,所有行都会被赋值为'1',不会进入后续的elif和else分支。
注意你原始类别字符串前面都带有空格,匹配时不要遗漏空格,否则会出现匹配失败进入else分支的情况
修正方案
1. 基础修正写法
直接使用in成员运算符判断值是否在目标集合内,逻辑清晰易读:
for k in range(0, data.shape[0]): if data[k, 1] in (' Car', ' Motorcycle', ' Bicycle', ' Pedestrian'): data[k, 1] = '1' elif data[k, 1] in (' Heavy Vehicle', ' Medium Vehicle', ' Bus'): data[k, 1] = '2' else: data[k, 1] = '3'
2. 高性能ndarray专属写法
你操作的是numpy的ndarray结构,不需要写Python级别的循环,使用向量化操作性能更高,尤其适合数据量较大的场景:
import numpy as np # 定义类别到数值的映射规则 mapping = { ' Car': '1', ' Motorcycle': '1', ' Bicycle': '1', ' Pedestrian': '1', ' Heavy Vehicle': '2', ' Medium Vehicle': '2', ' Bus': '2' } # 批量映射,不在映射表中的值默认返回'3' data[:, 1] = np.vectorize(lambda x: mapping.get(x, '3'))(data[:, 1])
内容的提问来源于stack exchange,提问作者QuagTeX
相关产品推荐
相关产品推荐

