基于最后一列累加NumPy数组行,为不同长度轨迹ID动态加漂移
处理不同长度轨迹的漂移添加与按ID累加的简便方法
嘿,这个需求完全可以通过分组操作来动态适配不同长度的轨迹,不管你的轨迹是3个点还是6个点都能轻松处理。我给你分享两种方案:纯NumPy原生实现,以及用Pandas简化代码的快捷方式,你可以根据项目依赖和习惯来选。
首先咱们明确核心步骤:
- 按轨迹ID把原始数组拆分成独立的轨迹组
- 对每个轨迹组,从第二个时间点开始添加漂移(这里我用线性递增的漂移举例,你可以改成随机漂移或其他规则)
- 按ID完成轨迹内的行累加(这里假设是计算每个轨迹的累计坐标变化,要是你需要的是其他累加逻辑,比如组内求和,可以直接调整)
方案一:纯NumPy原生实现
这种方法不需要额外依赖,完全用NumPy的函数搞定:
import numpy as np # 模拟输入数据:形状(N,4),前3列x/y/z,第4列轨迹ID arr = np.array([ [1.0, 2.0, 3.0, 1], [1.1, 2.1, 3.1, 1], [1.2, 2.2, 3.2, 1], [4.0, 5.0, 6.0, 3], [4.1, 5.1, 6.1, 3], [4.2, 5.2, 6.2, 3], [4.3, 5.3, 6.3, 3], [4.4, 5.4, 6.4, 3], [4.5, 5.5, 6.5, 3] ]) # 1. 按ID分组:获取唯一ID和分组索引 unique_ids, group_indices = np.unique(arr[:, 3], return_inverse=True) # 计算每个组的长度,然后拆分数组 group_lengths = np.bincount(group_indices) split_points = np.cumsum(group_lengths)[:-1] trajectory_groups = np.split(arr, split_points) # 定义漂移参数:x/y/z方向的漂移率(可自定义) drift_rates = np.array([0.1, 0.05, 0.02]) processed_groups = [] for group in trajectory_groups: num_points = len(group) # 生成漂移数组:第一个点漂移为0,后续点按步数递增 drift_vals = np.zeros((num_points, 3)) if num_points > 1: # 步数从1开始(对应第二个点)到num_points-1 steps = np.arange(1, num_points).reshape(-1, 1) drift_vals[1:] = steps * drift_rates # 给坐标添加漂移 group[:, :3] += drift_vals # 计算轨迹内的行累加(累计坐标) cumulative_coords = np.cumsum(group[:, :3], axis=0) # 把累加结果和ID合并 group_with_cum = np.hstack([cumulative_coords, group[:, 3:4]]) processed_groups.append(group_with_cum) # 合并所有处理后的轨迹 final_result = np.vstack(processed_groups) print(final_result)
方案二:用Pandas简化操作
如果你项目里已经用了Pandas,那代码会更简洁,groupby功能天生适配这种按ID分组的场景:
import numpy as np import pandas as pd # 同样用刚才的模拟数据 arr = np.array([ [1.0, 2.0, 3.0, 1], [1.1, 2.1, 3.1, 1], [1.2, 2.2, 3.2, 1], [4.0, 5.0, 6.0, 3], [4.1, 5.1, 6.1, 3], [4.2, 5.2, 6.2, 3], [4.3, 5.3, 6.3, 3], [4.4, 5.4, 6.4, 3], [4.5, 5.5, 6.5, 3] ]) # 转成DataFrame,方便分组操作 df = pd.DataFrame(arr, columns=["x", "y", "z", "id"]) def process_trajectory(group): num_points = len(group) if num_points <= 1: # 只有一个点的轨迹不需要加漂移 group["cum_x"] = group["x"] group["cum_y"] = group["y"] group["cum_z"] = group["z"] return group # 给从第二个点开始的坐标加漂移 steps = np.arange(1, num_points) group.loc[group.index[1:], "x"] += steps * 0.1 group.loc[group.index[1:], "y"] += steps * 0.05 group.loc[group.index[1:], "z"] += steps * 0.02 # 计算累计坐标 group["cum_x"] = group["x"].cumsum() group["cum_y"] = group["y"].cumsum() group["cum_z"] = group["z"].cumsum() return group # 按ID分组处理每个轨迹 processed_df = df.groupby("id").apply(process_trajectory) # 转回NumPy数组(如果需要的话) final_result = processed_df.to_numpy() print(final_result)
两种方案都能自动适配不同长度的轨迹——不管你的轨迹是3个点还是6个点,分组后都会单独处理每个组的漂移和累加逻辑,完全不用手动判断轨迹长度。
内容的提问来源于stack exchange,提问作者Liwellyen
相关产品推荐
相关产品推荐

