Skip to main content
 首页 » 编程设计

python之如何在 python 中向量化一组项目

2025年05月04日7sxdcgaq8080

我正在尝试获取一组数组并将它们转换成一个矩阵,该矩阵本质上是一组项目的指示矩阵。

我目前有一个包含 N 项的数组

A_ = [A,B,C,D,E,...,Y,Z]  

此外,我有 S 个数组(当前存储在一个数组中),它们包含向量 A 中的项目的子集。

B_ = [A,B,C,Z] 
C_ = [A,B] 
D_ = [D,Y,Z] 

它们存储的数组是这样的结构:

X = [B_,C_,D_] 

我想将数据转换成指标矩阵以便于操作。理想情况下它看起来像这样(它将是一个 N x S 大小的矩阵):

[1,1,1,0,...,0,1] 
[1,1,0,0,...,0,0] 
[0,0,0,1,...,1,1] 

我知道如何使用 for 循环遍历它并创建矩阵,但我想知道是否有更有效/语法更简单的方法来处理这个问题。

请您参考如下方法:

一个简洁的方法是使用 list comprehension.

# Create a list containing the alphabet using a list comprehension 
A_ = [chr(i) for i in range(65,91)] 
 
# A list containing two sub-lists with some letters 
M = [["A","B","C","Z"],["A","B","G"]] 
 
# Nested list comprehension to convert character matrix  
# into matrix of indicator vectors 
I_M = [[1 if char in sublist else 0 for char in A_] for sublist in M] 

如果您不熟悉推导式,那么最后一行有点密集,但是一旦您将其拆开,它就不会太棘手。内部...

[1 if char in sublist else 0 for char in A_] 

本身就是一个列表推导式,它为 A_ 中的所有字符 (char) 创建一个包含 1 的列表,它也在 sublist 中找到>,对于 sublist 中未找到的字符,则为 0。

外位...

[ ... for sublist in M] 

简单地为在 M 中找到的每个 sublist 运行内部列表推导,产生由存储在 I_M 中的内部列表推导创建的所有子列表的列表。

编辑:

虽然我试图让这个示例保持简单,但值得注意(正如 DSM 和 jterrace 指出的那样)testing membership in vanilla arrays is O(N) .将其转换为类似于 Set 的散列结构会加快检查大型子列表的速度。