我最近正在处理一个扩散模拟项目,我想出了以下代码:
N = 10000000
num_steps = 100
dim = 3
particles2 = npr.uniform(-1, 1, (N, num_steps, dim))
particles = np.cumsum(particles2, axis=1)
简单说明一下:前3行是仿真参数;粒子数 ()、模拟时间步数 ( num_step) 和模拟的维数 ( dim)。我通过将每个粒子视为随机游走器来模拟扩散,因此我使用该numpy.random模块为每个时间步生成一个随机平移向量,这样每个坐标就是一个介于和之间的随机数。现在,在该行中,我生成一个填充了和之间随机数的张量,然后在下一行中使用累积和来对不同的时间步进行求和。这与以下(更直观的)代码完全相同,但效率更高:particles2
particles = np.zeros((N, num_steps, dim))
for i in range(N):
prev_vec = np.zeros((dim))
for t in range(num_steps):
trans_vec = npr.uniform(-1, 1, dim)
particles[i, t, :] = prev_vec
prev_vec = prev_vec + trans_vec
其中prev_vec代表“前一个向量”,trans_vec代表每个时间步的随机平移向量。
但是,我有一个问题 - 内存使用情况。由于我存储了每个粒子的整个轨迹,因此我(相对)快速达到了可用内存上限。对于分析,我只需要最后一个时间步,所以我并不需要整个轨迹。我在底部代码中看到了如何解决这个问题:
particles = np.zeros((N, dim))
for i in range(N):
prev_vec = np.zeros((dim))
for t in range(num_steps):
trans_vec = npr.uniform(-1, 1, dim)
prev_vec = prev_vec + trans_vec
particles[i,:] = prev_vec
但我不知道如何在上面解决这个问题,更高效的代码。我想这样做,因为 2 个 for 循环确实使计算变慢。