PyTorch:如何将布朗运动路径的张量列表拼接为指定形状张量
布朗运动模拟张量维度调整问题
问题背景
给定初始数据集:
data = torch.normal(0, 1, size = (1, 3)) dataset = torch.tensor(data.T).float() print(dataset) #tensor([[-2.1445], # [-1.3322], # [-0.6355]])
需要从这些一维点出发,模拟步长为dt、时长到t的布朗运动。当dt = .01且t = .02时,期望输出维度为3行3列的张量(每行对应一个初始点的运动路径,每列对应不同时间点t=0、t=0.01、t=0.02):
#tensor([[-2.1445, -2.1035, -2.1022], # [-1.3322, -1.3121, -1.3210], # [-0.6355, -0.6156, -0.5999]])
现有代码问题
尝试的代码返回多个尺寸为3的张量组成的列表,无法满足输出(k + 1, 3)(实际对应期望的(3, k+1))的张量需求:
def brownian_motion(x, t, dt): k = int(t / dt) path = [x] path.append(x) for i in range(k): xi = torch.normal(torch.zeros(x.shape), torch.ones(x.shape)) x += numpy.sqrt(dt) * xi path.append(x)
解决方案
调整代码的路径初始化与最终拼接逻辑,即可得到目标维度的张量:
import torch import numpy as np def brownian_motion(x, t, dt): k = int(t / dt) # 初始化路径,仅保留t=0的初始状态 path = [x] current_x = x.clone() # 克隆初始值,避免修改输入张量 for _ in range(k): # 生成对应形状的布朗运动增量 xi = torch.normal(torch.zeros_like(current_x), torch.ones_like(current_x)) current_x += np.sqrt(dt) * xi path.append(current_x) # 将列表中的列向量按列拼接,得到(3, k+1)形状的张量,匹配期望输出格式 return torch.cat(path, dim=1)
关键调整说明
- 去掉原代码中重复添加初始
x的错误操作,确保路径起始只有t=0的状态。 - 使用
x.clone()避免修改输入的原始张量,保证数据独立性。 - 用
torch.zeros_like和torch.ones_like替代手动创建形状,代码更简洁健壮。 - 通过
torch.cat(path, dim=1)将列表中所有(3,1)形状的列向量拼接为(3, k+1)的张量,完全符合期望的输出结构。
测试调用示例:
# 初始化数据集 data = torch.normal(0, 1, size=(1, 3)) dataset = torch.tensor(data.T).float() # 生成布朗运动路径 result = brownian_motion(dataset, t=0.02, dt=0.01) print(result)
内容的提问来源于stack exchange,提问作者0xbadf00d
相关产品推荐
相关产品推荐

