Python抽样时如何排除与已选列表同索引的图像?
解决方案:从列表抽样并排除指定标识的图像
核心思路
先从negTest中提取需要排除的人脸唯一标识,再过滤list2排除包含这些标识的元素,最后对过滤后的列表随机抽样得到posTest。
具体实现步骤
提取需排除的人脸标识
从negTest的每个元素中解析出对应的人脸唯一标识(比如AF01、CFD-WF-011),根据文件名格式做针对性解析:- 对于
AF/AM开头的文件名,取下划线分割后的第一部分 - 对于
CFD开头的文件名,取短横线分割后的前三部分拼接结果 - 其他格式可根据实际情况调整解析逻辑
- 对于
过滤
list2
遍历list2,剔除所有包含已提取标识的元素,得到可抽样的候选列表。随机抽样生成
posTest
使用random.sample对过滤后的列表进行抽样,抽样数量可与negTest保持一致。
完整代码示例
import random def get_face_id(item): # 拆分出文件路径(去掉后面的参数部分) file_path = item.split(',')[0] # 提取文件名 filename = file_path.split('/')[-1] if filename.startswith('AF') or filename.startswith('AM'): # 处理AF/AM开头的标识 return filename.split('_')[0] elif filename.startswith('CFD'): # 处理CFD开头的标识,提取CFD-WF-xxx部分 parts = filename.split('-') return '-'.join(parts[:3]) else: # 处理其他格式的标识,比如004_o_m_a_a.png取004 return filename.split('_')[0] # 示例negTest negTest = ["Stimuli/Faces/resized_neg_faces/AF01_AC.png,0.55,-1.5", "Stimuli/Faces/resized_neg_faces/AF06_AC.png,0.55,-1.5"] # 1. 获取需要排除的标识 excluded_ids = [get_face_id(item) for item in negTest] # 2. 过滤list2 filtered_list2 = [item for item in list2 if not any(face_id in item for face_id in excluded_ids)] # 3. 随机抽样生成posTest(这里抽2个,和negTest数量一致) posTest = random.sample(filtered_list2, 2) print(posTest)
说明
- 如果你的文件名格式有变化,只需修改
get_face_id函数的解析逻辑即可适配 - 确保过滤后的
filtered_list2长度大于等于抽样数量,避免random.sample抛出异常
内容的提问来源于stack exchange,提问作者cjb10
相关产品推荐
相关产品推荐

