从列表中创建每个唯一值的二进制矩阵

3
这个问题在概念上类似于这个问题:Python Pandas: How to create a binary matrix from column of lists?,但由于我的数据规模很大,我不想将其转换为pandas数据框。
我有一个如下的列表:
list_ = [[5, 3, 5, 2], [6, 3, 2, 1, 3], [5, 3, 2, 5, 2]]

我希望您能够提供一个二进制矩阵,每个唯一的值都是一列,每个子列表是一行。如果有超过 100,000 个子列表,每个列表大约有 1,000 个项,应如何高效地完成此操作?编辑:示例输出类似于上面链接中的问题中的输出,其中该列表基本上可以视为:
list_ = [["a", "b"], ["c"], ["d"], ["e"]]

   a  b  c  d  e
0  1  1  0  0  0
1  0  0  1  0  0
2  0  0  0  1  0
3  0  0  0  0  1

你这里有一个不规则列表。你能解释一下你的输出应该是什么样子的吗? - cs95
1
总共有多少个唯一值?在最坏的情况下,将会有10**8个唯一值,导致矩阵中有10**13个条目,因此您最好拥有几个TB的内存来适应矩阵。更重要的是,为什么首先要将数据转换为不太内存有效的表示形式?请提供有关您正在解决的问题的更多上下文。 - Sven Marnach
@SvenMarnach 我想对每个特征(数字)进行费舍尔精确检验,并将其用作特征选择方法。我还有另一个包含每个子列表分类分配的列表。也许最好迭代处理。如果您能提供一些见解,那将不胜感激。 - Jack Arnestad
2个回答

2
使用sklearn的CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(tokenizer=lambda x: x, lowercase=False)
m = cv.fit_transform(list_)

# To transform to dense matrix
m.todense()

# To get the values correspond to each column
cv.get_feature_names()

# If you need dummy columns, not count
m = (m > 0)

出于内存原因,您可能希望将其保留为稀疏矩阵。


0
子集(行)中的值将是其余列中1(True)和0(False)的位置:
import numpy as np

list_ = [[5, 3, 5, 2], [6, 3, 2, 1, 3], [5, 3, 2, 5, 2]]

##################################
# convert to binary matrix
##################################
#find number of columns(dimenseion of matrix) 
nbr_of_columns = max(map(max, list_))+1 #maximun value in lists_

Mat = np.zeros((len(list_), nbr_of_columns), dtype=bool)
for i in range(0, len(list_)):
    for j in range(0, len(list_[i])):
        Mat[i, list_[i][j]] = True
        
print(Mat)

在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接