cython:numpy数组中可能的优化

2024-09-30 04:32:33 发布

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

下面是我从多元正态分布中提取的Cython代码。我使用循环,因为每次我有不同的密度。(conLSigma是Cholesky因子)

这需要很多时间,因为我要对每个循环进行逆分解和Cholesky分解。它比纯python代码更快,但我想知道是否有任何方法可以提高速度。在

from __future__ import division

import numpy as np 

cimport numpy as np 

ctypedef np.float64_t dtype_t

cimport cython
@cython.boundscheck(False)
@cython.wraparound(False)

def drawMetro(np.ndarray[dtype_t, ndim = 2] beta,
              np.ndarray[dtype_t, ndim = 3] H,
              np.ndarray[dtype_t, ndim = 2] Sigma,
              float s):

    cdef int ncons = betas.shape[0]
    cdef int nX = betas.shape[1]
    cdef int con

    cdef np.ndarray betas_cand = np.zeros([ncons, nX], dtype = np.float64)
    cdef np.ndarray conLSigma = np.zeros([nX, nX], dtype = np.float64)

    for con in xrange(ncons):
        conLSigma = np.linalg.cholesky(np.linalg.inv(H[con] + Sigma))
        betas_cand[con] = betas[con] + s * np.dot(conLSigma, np.random.standard_normal(size = nX))

    return(betas_cand)

Tags: 代码npconcythonintndarraynxdtype
2条回答

Cholesky分解创建一个下三角矩阵。这意味着在np.dot中完成的乘法有将近一半不需要执行。如果你换线

betas_cand[con] = betas[con] + s * np.dot(conLSigma, np.random.standard_normal(size = nX))

进入

^{pr2}$

但是,你也需要改变

^{3}$

进入

cdef np.ndarray betas_cand = np.array(betas)

当然,您可以使用切片进行乘法运算,但我不确定它是否会比我建议的更快。不管怎样,希望你能明白。我不认为你还能做什么来加速这个过程。在

先计算cholesky分解,然后反代换求下三角矩阵。这应该比利纳格乔尔斯基(利纳格投资公司(S) )。在

相关问题 更多 >

    热门问题