【问题标题】:How to vectorize a set of items in python如何在python中矢量化一组项目
【发布时间】:2014-01-18 04:21:48
【问题描述】:

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

我目前有一个包含 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 循环来遍历它并创建矩阵,但我想知道是否有更有效/语法上更简单的方法来解决这个问题。

【问题讨论】:

标签: python arrays matrix vectorization


【解决方案1】:

一种简洁的方法是使用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)创建一个列表,该列表也在sublist 中找到,而在sublist 中找不到的字符则为0。

外部位...

[ ... for sublist in M]

只需对M 中的每个sublist 运行内部列表推导,从而生成由存储在I_M 中的内部列表推导创建的所有子列表的列表。

编辑:

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

【讨论】:

  • 你可以将1 if char in sublist else 0浓缩成int(char in sublist)。您还可以通过使用for subset in map(set, M) 来加快它的速度(对于大 S),因为在大集合中测试成员资格比在大列表中测试更快。
【解决方案2】:

使用 numpy:

>>> import numpy as np
>>> A_ = np.array(['A','B','C','D','E','Y','Z'])
>>> B_ = np.array(['A','B','C','Z'])
>>> C_ = np.array(['A','B'])
>>> D_ = np.array(['D','Y','Z'])
>>> X = [B_,C_,D_]
>>> matrix = np.array([np.in1d(A_, x) for x in X])
>>> matrix.shape
(3, 7)
>>> matrix
array([[ True,  True,  True, False, False, False,  True],
       [ True,  True, False, False, False, False, False],
       [False, False, False,  True, False,  True,  True]], dtype=bool)

这是O(NS)

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 2016-02-24
    • 2023-02-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多