问题
考虑
synchronized(this)
然后我想找到一个稀疏的COO矩阵的索引,这样
P: A (N, n_x) matrix.
更快的解决方案
上述解决方案在时间和内存方面均效率低下。下面是使用Numpy的一个更快的选项
indices = []
for i in range(N):
for j1 in range(n_x):
for j2 in range(n_x):
indices.append([P[i, j1], P[i, j2]])
indices = unique(indices, axis=0)
但是请注意,这仍然需要构建2个col_idx = np.reshape(np.tile(P, n_x), [N, n_x, n_x])
row_idx = np.transpose(col_idx, [0,2,1])
indices = np.concatenate((row_idx[:,None], col_idx[:, None]), axis=1)
indices = np.unique(indices, axis=0)
数组,如果我们只有少量的唯一元素,则它们可能会比所需数组大得多。
问题
我该如何建立快速但又能节省内存的算法来执行以下操作。当前,快速解决方案不可用,因为它需要太多内存。
解决方案可以是Python,但我可以用C编写的算法就足够了。
答案 0 :(得分:0)
我认为在C ++和Python中,要使用的方法都是使用集合。
在下面的版本中,我使用了Numba,它给出了载脂蛋白。速度比纯Python版本提高了30倍。
Python
import numba as nb
import numpy as np
import time
N=500
n_x=600
P=np.random.randint(0,50,N*n_x).reshape(N,n_x)
@nb.jit()
def nb_sparse_coo(P):
indices = set()
for i in range(P.shape[0]):
for j1 in range(P.shape[1]):
for j2 in range(j1,P.shape[1]):
indices.add((P[i, j1], P[i, j2]))
return np.array(list(indices))
indices=nb_sparse_coo(P)