从指标的笛卡尔积构建稀疏的COO矩阵结构

时间:2018-08-22 11:19:28

标签: python sparse-matrix

问题

考虑

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编写的算法就足够了。

1 个答案:

答案 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)