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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:57:20