如何在python中有效地制作大型稀疏矩阵?

时间:2020-04-17 11:33:22

标签: python performance numpy matrix variable-assignment

1。 我尝试制作一个形状为(6962341,268148)的numpy数组,键入:np.uint8

2。 我的数据包括[x1,x2,x3,x4],[x2,x1],[x4,x5,x3] ...

3。 我想分配array [x1,x2] + = 1,array [x1,x3] + = 1,array [x1,x4] + = 1,array [x2,x3] + = 1,...

4。 所以我尝试了以下结构的功能。


import numpy as np
from itertools import combinations

base_array = np.zeros((row_size, col_size), dtype=np.uint8))

for each_list in data:
  for (x,y) in list(combinations(each_list,2)):
    if x>y:
      base_array[y,x] += 1
    else:
      base_array[x,y] += 1

它基本上计算矩阵的上三角,而我将使用上三角值。您也可以认为这类似于将基本矩阵A设为共现矩阵。但是此功能太慢,我认为可以提高速度。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

假设您的数据是整数(因为它们代表行和列),或者您可以将数据x1, x2, ...散列为1, 2, ...整数,这是一个快速的解决方案:

#list of pairwise combinations in your data
comb_list = []
for each_list in data:
  comb_list += list(combinations(each_list,2))

#convert combination int to index (numpy is 0 based indexing)
comb_list = np.array(comb_list) - 1

#make array with flat indices
flat = np.ravel_multi_index((comb_list[:,0],comb_list[:,1]),(row_size,col_size))

#count number of duplicates for each index using np.bincount
base_array = np.bincount(flat,None,row_size*col_size).reshape((row_size,col_size)).astype(np.uint8)

样本数据:

[[1, 2, 3, 4], [2, 1], [4, 5, 3, 4]]

对应的输出:

[[0 1 1 1 0]
 [1 0 1 1 0]
 [0 0 0 2 0]
 [0 0 1 1 1]
 [0 0 1 1 0]]

编辑:对应于注释中的解释:

data=[[1, 2, 3, 4], [2, 1], [4, 5, 3, 4]]
base_array = np.zeros((len(data), np.max(np.amax(data))), dtype=np.uint8)

for i, each_list in enumerate(data):
  for j in each_list:
    base_array[i, j-1] = 1

输出:

[[1 1 1 1 0]
 [1 1 0 0 0]
 [0 0 1 1 1]]