You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于最后一列累加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:22:49