如何在numpy数组中不使用两个For循环的情况下提高时间复杂度,优化结构?

问题描述 投票:0回答:1

我从先前定义的类中得到了一些结果。它可以组装成2D(10,10)numpy矩阵P,com是另一个对应的2D矩阵。

我希望提高这部分代码的时间复杂度,就像使用其他方式而不是两次for循环一样。或者可以对代码的其余部分进行一些改进,从而提高时间复杂度。

关键是P矩阵将始终是对称的,并且r_nm也需要对称。所以我想这部分可以用数学方法来改善。或使用矢量化等方法简化过程。

基于P矩阵中元素的值,我需要为top tier1矩阵选择r_nm个元素,将r_nm中的对应位置设置为r1值。

然后从tier+1top tier2中选择,将r_nm中的相应位置设置为r2值。

最后一步,将其余位置设置为r3值。如果之前将其设置为r2值或r3,则第1层需要覆盖该值。同样,r2需要覆盖r3。并且r_nm[:,case+gl-2:case+gl]r_nm[case+gl-2:case+gl,:]需要设置为零。

对此有什么建议吗?

提前感谢!

import numpy as np

tier1 = 9
tier2 = 20
Gzone = 5
Lzone = 10
case = 5
gl = 5
r1 = 0     #Active
r2 = 20    #LessActive
r3 = 1000  #Rare

r_nm = np.zeros([case+gl,case+gl],dtype = np.int) 
p = np.zeros([case+gl,case+gl])

for k,i in enumerate(p):
    for y,j in enumerate(i):        
        for t in poolmarket.data.interval:
            p[k][y] = p[k][y] + com[k][y] * abs(poolmarket.variables.P_nm3[t,k,y].x)

p_save += p    
p[0:Gzone,0:Gzone ]=-np.inf
p[Gzone:Lzone,Gzone:Lzone ]= -np.inf

b = np.argpartition(p, -tier1)[:, -tier1:]              
d = np.argpartition(p, -tier2)[:, -tier2:]              

r_nm = np.ones([case+gl,case+gl],dtype = np.int) * r3     

r_nm[np.arange(r_nm.shape[0])[:,None],d] = r2    
r_nm[d,np.arange(r_nm.shape[0])[:,None]] = r2

r_nm[np.arange(r_nm.shape[0])[:,None],b] = r1
r_nm[b,np.arange(r_nm.shape[0])[:,None]] = r1

r_nm[:,case+gl-2:case+gl] =0
r_nm[case+gl-2:case+gl,:] =0
python python-3.x algorithm numpy
1个回答
0
投票

只是一个简单的示例,显示了手动迭代和内置函数之间的区别:

import numpy as np
import timeit

p = np.random.rand(1000)
q = np.random.rand(1000)

def manual_iterate(p, q):
    r = np.empty((1000,1000))
    for i in range(0, 1000):
        for j in range(0, 1000):
            r[i][j] = p[i] + 2*q[j]
    return r

def built_in_function(p, q):
    return p+2*q

print('manual iterate:')
%timeit manual_iterate(p, q)

print('built in iterate:')
%timeit built_in_function(p, q)

输出:

manual iterate:
1.77 s ± 15.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
built in iterate:
9.39 µs ± 75.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

所以您应该写类似:

abs_val = abs(poolmarket.variables.P_nm3.x)
p = p + com * abs_val
© www.soinside.com 2019 - 2024. All rights reserved.