能否为字典不同键的数组追加符合匹配条件的subjects行数据?
问题与解决方案
问题描述
我有如下字典:
import numpy as np groups = {'group1': np.array([450, 449.]), 'group2': np.array([490, 489.]), 'group3': np.array([568, 567.])}
通过numpy.loadtxt()加载txt文件后得到如下数组:
subjects = np.array([ [1.0, -1.0], [2.0, 1.0], [3.0, 2.0], ... [565.0, 564.0], [566.0, 565.0], [567.0, 566.0], [568.0, 567.0] ])
需求:判断subjects第一列的值是否等于字典中各数组的第二列值,满足条件时将该行数据追加到字典对应键的数组中,期望输出:
groups = { 'group1': np.array([[450, 449.], [449, 448]]), 'group2': np.array([[490, 489.], [489, 488]]), 'group3': np.array([[568, 567.], [567, 566]]) }
请问是否可以为字典的不同键追加不同的对应值?
解决方案
完全可以实现,利用NumPy的数组拼接功能即可完成,具体步骤如下:
- 遍历字典的每个键值对,提取每个组数组的第二列值作为匹配目标;
- 在
subjects中通过布尔索引筛选出第一列等于匹配目标的行; - 将筛选出的行拼接到对应组的数组中(注意先将原一维数组转为二维,再进行垂直拼接)。
示例代码
import numpy as np # 初始化字典 groups = { 'group1': np.array([450, 449.]), 'group2': np.array([490, 489.]), 'group3': np.array([568, 567.]) } # 模拟加载的subjects数组(实际场景用np.loadtxt读取文件) subjects = np.array([ [449, 448], [489, 488], [567, 566], [1.0, -1.0], [2.0, 1.0] ]) # 遍历字典完成匹配与追加 for group_name, arr in groups.items(): # 获取当前组的匹配目标(数组第二列值) target = arr[1] # 筛选符合条件的行 matched_rows = subjects[subjects[:, 0] == target] # 若有匹配行则拼接更新 if len(matched_rows) > 0: groups[group_name] = np.vstack([arr.reshape(1, -1), matched_rows]) # 输出结果 print(groups)
关键说明
- 原字典中的数组是一维结构,需用
reshape(1, -1)转为二维后,才能和匹配到的二维行数组拼接; subjects[:, 0] == target生成的布尔数组可快速定位符合条件的行;- 若
subjects中有多行匹配同一组的目标,代码会自动将所有匹配行追加进去。
内容的提问来源于stack exchange,提问作者Ludovica
相关产品推荐
相关产品推荐

