繁体   English   中英

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

[英]How to improve time complexity without using two For loops in numpy array, optimize the structure?

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

我希望提高这部分代码的时间复杂度,比如使用其他方式而不是两个 for 循环。 或者可以对代码的 rest 部分进行一些改进,从而具有更好的时间复杂度。

关键是P矩阵总是对称的,r_nm也需要对称。 所以我想这部分的数学方法可以改进一些东西。 或者使用矢量化等方法来简化程序。

根据P矩阵中元素的值,我需要为r_nm矩阵的select top tier1元素,设置r_nm中对应的r_nm为r1值。

然后 select 从tier+1top tier2 ,将 r_nm 中对应的r_nm设置为 r2 值。

最后一步,将position的rest设置为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

只是一个简单的例子来展示手动迭代和内置函数之间的区别:

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)

output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM