使用Numpy将3D点数组添加到存储时序的3D点二维数组中
如何给3D位置数组添加每个时间步的数据
嘿,这个问题其实很好解决,咱们用NumPy来处理最顺手——毕竟你已经明确了数组的形状,核心就是把每个时间步的位置数据精准放到对应的切片里就行。
首先得理清楚你的数组维度逻辑:(300, 1000, 3) 对应 [物体数量, 时间步数, 3D坐标(x/y/z)],所以每个时间步你获取的300个物体的位置,是一个形状为(300, 3)的数据集,刚好能对应数组里的「所有物体 + 当前时间步 + 所有坐标」的切片。
1. 初始化数组(如果还没完成)
假设你用NumPy来创建这个多维数组(这是处理这类数值数据的标准工具):
import numpy as np # 创建全0的初始化数组,如果之后会覆盖所有值,也可以用np.empty来节省初始化时间 positions = np.zeros((300, 1000, 3))
2. 单个时间步的赋值操作
假设你在第t个时间步(注意Python是0索引,所以t从0到999)获取到了当前所有物体的位置,直接赋值到对应切片即可:
情况1:获取的数据已经是NumPy数组(形状(300,3))
# 模拟获取当前时间步的位置数据(替换成你实际获取数据的代码) current_positions = np.random.rand(300, 3) # 用随机数模拟真实的3D位置 # 核心赋值:选中所有物体、第t个时间步、所有坐标,把当前数据填进去 positions[:, t, :] = current_positions
情况2:获取的数据是Python列表(比如[[x1,y1,z1], [x2,y2,z2], ..., [x300,y300,z300]])
先把列表转成NumPy数组再赋值,避免维度不匹配的问题:
# 模拟列表格式的位置数据 current_positions_list = [[1.0, 2.0, 3.0] for _ in range(300)] # 转成NumPy数组 current_positions = np.array(current_positions_list) # 同样赋值 positions[:, t, :] = current_positions
3. 批量处理所有1000个时间步
如果要循环处理所有时间步,直接遍历每个时间索引就行:
for t in range(1000): # 替换成你实际获取当前时间步位置的逻辑 current_positions = get_current_frame_positions() # 自定义函数,返回(300,3)的数据 # 处理列表转数组(如果你的数据源返回的是列表) if isinstance(current_positions, list): current_positions = np.array(current_positions) # 赋值到对应时间步 positions[:, t, :] = current_positions
为什么这个切片能work?
[:, t, :]这个切片的含义很明确:
- 第一个
::选中所有300个物体 t:选中第t个时间步的位置- 最后一个
::选中所有3个坐标值
刚好和你每个时间步获取的(300,3)数据维度完全匹配,赋值操作会自动把每个物体的坐标对应到数组里的正确位置,不会出现错位。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

