如何在python中向量化嵌套的for循环

时间:2017-03-22 17:53:15

标签: python for-loop vectorization

我最关心的是效率。我有一个很长的ID列表,我有一个较短的ID列表。我想在第二个列表中存储ID的位置,这些位置对应于第一个列表中的每个ID(每个ID应该只在每个列表中出现一次)。我已经编写了一个嵌套的for循环来执行此操作,但由于第一个列表包含超过1000个元素,而第二个列表包含超过80k的元素,因此下面的代码需要很长时间(但有效)。

IDD1 = [0] * leng
IDD2 = [0] * leng
## Match IDs to position in table
for i in range(leng):
    for j in range(len(halo_id)):
        if ID1[i] == halo_id[j]:
            IDD1[i] = j
        if ID2[i] == halo_id[j]:
            IDD2[i] = j

如果它有任何相关性,则ID最初来自halotools光环目录表。

编辑:

在两种情况下,数据实际上只是一个整数列表。我想要的结果是整数列表(索引)。 ID1和ID2基本上是相同的,我只需要以相同的方式对它们进行操作。它们是我之前拥有的整数列表。 halo_id是相同但更长的。

1 个答案:

答案 0 :(得分:2)

首先,创建ID到位置的映射:

idmap = {i: e for (e, i) in enumerate(halod_id)}

然后遍历较小的列表并将其放入映射:

idd1 = [idmap[el] for el in id1]

这将操作从O(n * m)减少到O(n + m)。