有没有更有效(即更快)的方法来计算相关随机游动?

2024-10-01 00:14:36 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有什么方法可以矢量化或者加速?我已经在使用numba来进行抖动,但它仍然是一个主要的瓶颈。在一维numpy数组上使用numba来jit我的函数,可以使代码速度提高一个数量级,但在下面的二维数组上使用numba时,性能的改善可以忽略不计。分解是一个numpy矩阵,表示相关矩阵的cholesky分解,x和n是常数,nrand是随机数在

@jit
def generate_random_correlated_walks(decomposition, x, n):

    uncorrelated_walks = np.empty((2*x, n))

    for i in range(x):
        # Generate the random uncorrelated walks
        wv = nrand.normal(loc=0, scale=1, size=n)
        ws = nrand.normal(loc=0, scale=1, size=n)
        uncorrelated_walks[2*i] = wv
        uncorrelated_walks[(2*i) + 1] = ws

    # Create a matrix out of these walks
    uncorrelated_walks = np.matrix(uncorrelated_walks)

    m, n = uncorrelated_walks.shape
    correlated_walks = np.empty((m, n))

    # Go through column and correlate the walk values
    for i in range(n):
        correlated_timestep = np.transpose(uncorrelated_walks[:, i]) * decomposition
        correlated_walks[:, i] = correlated_timestep

    return correlated_walks

编辑:我已经做了建议的更改,现在我的代码如下,但不幸的是仍然是一个主要的瓶颈。有什么想法吗?在

^{pr2}$

Tags: 代码numpyfornprandom数组jitempty
1条回答
网友
1楼 · 发布于 2024-10-01 00:14:36

您可以改进的第一件事是删除for循环。如果您相信使用相同的输入参数调用^{}一堆次,那么它没有任何好处,如果您相信它确实会生成随机数。在

不要使用^{},请使用^{}。当你考虑到前一项可以用来将你的功能的整个第一部分缩短为一个步骤时,这将使你的生活更轻松。在

当然,您可以通过一个简单的矩阵乘法来完全删除最后的循环:uncorrelated_walks.T @ decomposition将给您当前的correlated_walks的转置。您可以通过更改参数的顺序来避免transposes之一。在

你最终会得到这样的结果:

def generate_random_correlated_walks(decomposition, x, n):
    uncorrelated_walks = nrand.normal(loc=0, scale=1, size=(2*x, n))
    correlated_walks = np.dot(decomposition.T, uncorrelated_walks)
    return correlated_walks

不知道这对您有多大的帮助,但是删除Python级别的循环应该是一种提升,因为它将减少多个numy调用的开销。在

你可以牺牲易读性,把整件事变成一句话:

^{pr2}$

相关问题 更多 >