使用Enum对NumPy数组做条件过滤时筛选失效该如何解决?
错误原因
- 未导入NumPy库:代码中使用了
np.array但缺少import numpy as np声明,运行会直接报错。 - 枚举定义错误:
MALE = 1,末尾多余的逗号会让MALE的取值变为元组(1,)而非整数1,不符合枚举定义预期。 - 数组索引逻辑错误:
people[1]是取数组的第二行(NumPy默认第一维度为行索引),而非你预期的第二列(性别列),匹配条件自然无法命中目标数据。 - 未指定结构化数组dtype:直接传入元组列表生成数组时,默认生成dtype为
object的二维数组,如果你希望通过字段名访问的话需要单独声明结构化类型。
修正方案
方案1:使用结构化数组(推荐,语义更清晰
from enum import Enum import numpy as np class Gender(Enum): MALE = 1 FEMALE = 2 # 声明结构化数组的字段类型,分别对应姓名、性别两个字段 people = np.array( [ ('John Smith', Gender.MALE), ('Samantha Wheeler', Gender.FEMALE), ], dtype=[('name', 'U20'), ('gender', Gender)] ) # 通过字段名筛选性别 guys = np.where(people['gender'] == Gender.MALE) girls = np.where(people['gender'] == Gender.FEMALE) # 验证结果 print(people[guys]) # 输出:[('John Smith', <Gender.MALE: 1)] print(people[girls]) # 输出:[('Samantha Wheeler', <Gender.FEMALE: 2)]
方案2:使用普通二维object数组
如果不需要字段名语义,也可以按列索引访问:
from enum import Enum import numpy as np class Gender(Enum): MALE = 1 FEMALE = 2 people = np.array( [ ('John Smith', Gender.MALE), ('Samantha Wheeler', Gender.FEMALE), ], dtype=object ) # [:, 1]代表取所有行的第二列(索引从0开始计数) guys = np.where(people[:, 1] == Gender.MALE) girls = np.where(people[:, 1] == Gender.FEMALE)
内容的提问来源于stack exchange,提问作者Gilbert Williams
相关产品推荐
相关产品推荐

