我正在尝试获取一组数组并将它们转换成一个矩阵,该矩阵本质上是一组项目的指示矩阵。
我目前有一个包含 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 的散列结构会加快检查大型子列表的速度。
关于python - 如何在 python 中向量化一组项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21199952/