我从先前定义的类中得到了一些结果。它可以组装成2D(10,10)numpy矩阵P,com
是另一个对应的2D矩阵。
我希望提高这部分代码的时间复杂度,就像使用其他方式而不是两次for循环一样。或者可以对代码的其余部分进行一些改进,从而提高时间复杂度。
关键是P矩阵将始终是对称的,并且r_nm也需要对称。所以我想这部分可以用数学方法来改善。或使用矢量化等方法简化过程。
基于P
矩阵中元素的值,我需要为top tier1
矩阵选择r_nm
个元素,将r_nm
中的对应位置设置为r1值。
然后从tier+1
到top 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
只是一个简单的示例,显示了手动迭代和内置函数之间的区别:
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