Python嵌套循环以获得子空间矩阵优化

2024-09-30 04:40:17 发布

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

我试图优化一个函数,该函数从给定所需成员的完全协方差矩阵中返回子协方差矩阵。完整的协方差矩阵可以包含500+个项目,我可以每次查看可变数量的成员,但每次调用可能不超过20个。它被调用10000多次。你知道吗

我的代码工作,但我想知道如何优化它。你知道吗

def subcovar(covar,elements):
    numelements = elements.shape[0]
    subcovar = np.zeros((numelements,numelements))

    for i in range(0,numelements):
        for j in range(0,numelements):
            subcovar[i,j]= covar[elements[i],elements[j]]

    return subcovar

谢谢 保罗


Tags: 项目函数代码infor数量defrange
2条回答

为什么不使用矩阵切片?[offical python docs]

下面是一个通过提取任意(即非连续)行和列来构建子矩阵的SO线程 Slicing of a numpy 2d array, or how do I extract an mxm submatrix from an nxn array (n>m)

根据迈克的回答,我回去查看切片,发现如下:

旧路时间=0.016201255250881966秒,从500x500中选择20x20
新路时间=0.0016199544633708396秒,从500x500中选择20x20

快10倍

旧路时间=0.09903732167528723秒,从500x500中选择50x50
新路时间=0.0022922701258387秒,从500x500中选择50x50

快43倍

旧路时间=2.669313751708479秒,从500x500中选择250x250
新路时间=0.003080821529599664秒,从500x500中选择250x250

快866倍

老路

def子胶囊(covar,元素):

start2 = time.clock()

covar = np.arange(250000).reshape((500, 500))
elements = np.arange(0,500,25) # this is the elements to choose 
numelements = elements.shape[0]
subcovar= np.zeros((numelements,numelements))

for i in range(0,numelements):
    for j in range(0,numelements):
        subcovar[i,j]= covar[elements[i],elements[j]]

end2 = time.clock()
print ("time ", end2 - start2)

return subcovar

纽威

def subcovarnew(covar,元素):

start2 = time.clock()

covar = np.arange(250000).reshape((500, 500))
elements = np.arange(0,500,2)
msize = elements.shape[0]
ii = elements.reshape(msize,1)
jj = elements.reshape(1,msize)
subcovar = covar[ii,jj]

end2 = time.clock()
print ("time ", end2 - start2)
return subcovar

谢谢 保罗

相关问题 更多 >

    热门问题