是否有numpy函数或某种方法来改进下一个嵌套for循环



我正在尝试计算一个corranking矩阵,但即使使用numpy ndarrays,时间复杂度也非常高,代码如下:

def coranking(self, HD: np.ndarray, LD: np.ndarray):
try:
if HD.size != LD.size:
raise CorankingException("matrices hdpd and ldpd do not have the same sizes")
nbr = HD.shape[0]
sss = HD.shape[1]
self.ndx1 = np.transpose(np.argsort(HD, axis=1))
self.ndx2 = np.transpose(np.argsort(LD, axis=1))
self.ndx4 = np.zeros((nbr, sss), dtype=np.uint32)
print(sss)
print(nbr)
start = timer()
for j in range(sss):
for i in range(nbr):
self.ndx4[self.ndx2[i, j], j] = i
print(f"FIRST O(N^2) process =>, {timer() - start:0.4f} sec")
del self.ndx2
c = np.zeros((nbr, sss), dtype=np.uint32)
start = timer()
for j in range(sss):
for i in range(nbr):
h = self.ndx4[self.ndx1[i, j], j]
c[i, h] += 1
print(f"SECOND O(N^2) process =>, {timer() - start:0.4f} sec")
del self.ndx1, self.ndx4
c = np.delete(c, 0, axis=0)
c = np.delete(c, 0, axis=1)
return c

那些嵌套的for循环需要很多时间才能执行,在我的机器中,第一个循环几乎需要8秒,第二个循环需要80秒,我曾尝试使用多处理模块,但我不知道在这种情况下如何实现它,我如何才能降低算法的复杂度?

我想办法让它更快,而不是

for j in range(sss):
for i in range(nbr):
self.ndx4[self.ndx2[i, j], j] = i

和这个

for j in range(sss):
for i in range(nbr):
h = self.ndx4[self.ndx1[i, j], j]
c[i, h] += 1

我做以下事情:

range_nbr = range(nbr)  # nbr is the number of points of the data input
for j in range(sss):
self.ndx4[self.ndx2[range_nbr, j], j] = range_nbr

对于第二个嵌套循环

for j in range(sss):
h = self.ndx4[self.ndx1[range_nbr, j], j]
c[range_nbr, h] += nbr

在过去,该算法几乎需要80秒才能执行,现在它减少到13秒,我认为它可以更快地实现多处理

相关内容

最新更新