如何在Awkward Array中过滤含异常值的事件轨道?
处理Awkward0中的异常轨道数据
由于Awkward0(旧版Awkward)没有新版Awkward那样的高层级过滤API,我们可以通过布尔掩码的方式在轨道级别过滤异常值,同时保留事件-轨道的层级结构。关键是不要过早将Awkward数组转换为numpy数组(否则会丢失嵌套结构),直接基于Awkward数组进行操作。
步骤1:保留Awkward数组结构读取数据
先读取数据为Awkward数组,避免立即转换为numpy数组(会扁平化结构,丢失轨道所属的事件信息):
import h5py import awkward as awkward0 import numpy as np dtype_X = np.float64 # 根据你的实际类型调整 f = h5py.File('dataAA/pv_HLT1CPU_MinBiasMagDown_14Nov.h5', mode="r") afile = awkward0.hdf5(f) # 保持为Awkward数组,不转numpy pocaz = afile["poca_z"].astype(dtype_X) pocaMx = afile["major_axis_x"].astype(dtype_X) pocaMy = afile["major_axis_y"].astype(dtype_X) pocaMz = afile["major_axis_z"].astype(dtype_X)
步骤2:构建轨道有效性掩码
针对每个变量的异常情况定义有效条件,再合并为单个轨道有效性掩码:
# 定义各变量的有效条件 valid_pocaz = np.abs(pocaz) < 100 # 根据物理场景调整极端值阈值 valid_pocaMx = np.isfinite(pocaMx) # 排除NaN/inf valid_pocaMy = np.isfinite(pocaMy) valid_pocaMz = np.isfinite(pocaMz) # 所有条件同时满足的轨道才有效 valid_track = valid_pocaz & valid_pocaMx & valid_pocaMy & valid_pocaMz
步骤3:过滤异常轨道
直接用掩码过滤Awkward数组,保留事件-轨道的层级结构:
# 方式1:单独过滤每个变量 filtered_pocaz = pocaz[valid_track] filtered_pocaMx = pocaMx[valid_track] filtered_pocaMy = pocaMy[valid_track] filtered_pocaMz = pocaMz[valid_track] # 方式2:将所有变量打包为记录数组后过滤(更易维护结构) tracks = awkward0.zip({ "poca_z": pocaz, "major_axis_x": pocaMx, "major_axis_y": pocaMy, "major_axis_z": pocaMz }) filtered_tracks = tracks[valid_track] # 从过滤后的记录数组中提取单个变量 filtered_pocaz = filtered_tracks["poca_z"]
说明
np.abs(pocaz) < 100中的阈值100需要根据你的物理数据实际范围调整,确保只排除真正的极端值。- 这种方法会自动保留事件结构:每个事件下只保留符合条件的轨道,不会破坏原有的嵌套层级。
内容的提问来源于stack exchange,提问作者Mike Sokoloff
相关产品推荐
相关产品推荐

