【问题标题】:how to make efficiently large sparse matrix in python?如何在python中有效地制作大稀疏矩阵?
【发布时间】:2020-07-30 21:30:26
【问题描述】:

1。 我尝试制作一个形状为 numpy 的数组:(6962341, 268148),输入: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。但是这个功能太慢了,我认为可以做得更快。 我该怎么办?

【问题讨论】:

  • 你的数据是什么x1, x2, ...types?
  • 我的数据只包含整数,每个列表不包含相同的元素

标签: python performance numpy matrix variable-assignment


【解决方案1】:

假设您的数据是整数(因为它们代表行和列),或者您可以将数据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]]

编辑:对应cmets中的解释:

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]]

【讨论】:

  • 谢谢!但是……我还不明白。我希望输出的形状等于 data.shape。你能详细解释一下吗?
  • @HyunNow 您的数据我的数据由 [x1,x2,x3,x4], [x2,x1], [x4,x5,x3]... 没有形状。它是一个列表列表。请提供示例输入和输出数据,以便我进行相应调整。目前,base_array 是形状为(xn, xn) 的二维数组,其中xn 是数据中的最大整数。
  • input_list = [[0,1],[0,2,3],[2,4]] 然后 output_array = [[1,1,0,0,0],[1, 0,1,1,0],[0,0,1,0,1]]。最后,我想计算共现矩阵的 np.dot(output_array.T, output_array)
  • 请详细说明如何根据输入数据创建形状为(3,5)output_array。此输出不与您提供的代码内联。我不清楚你想要它如何。通常共现矩阵是一个 NxN 矩阵,其中元素 (i,j)=# 次 i 和 j 出现在数据的同一个列表中。这就是我的代码创建的。如果这不是您要查找的内容,请详细说明如何准确计算输出中的每个元素 (i,j),以便我们提供更好的帮助。从它的外观来看,您正在寻找数据中列表的虚拟向量表示。对吗?
  • output_array 的形状是 (len(input_list), max_len(list in input_list)) 并且由 0 或 1 组成。我想你明白了,虚拟向量!我认为首先制作 output_array 并计算共现数组 = np.dot(output_array.T, output_array)。那么最终的 output_array 是正方形的。我有问题的代码返回 final_output_array。
猜你喜欢
  • 2012-05-18
  • 2020-12-07
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 2011-06-01
  • 2016-10-01
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多