并行过渡数组(Python 3)

Transition array in parallel (Python 3)

我正在处理大型数组,并尝试计算“转换”数组(请告诉我这个词是否适合它)。 用一个非常简单的例子:

old_indices = [1, 2, 3, 0]
indices = [2, 3, 0, 1]

由于索引 0 (1) 处的元素变为 3,因此转换的第一个元素为 3,对于索引 1 (2) 处的元素变为 0 的元素相同,因此它将为 0,依此类推. 那么过渡应该是:

transition = [3, 0, 1, 2]

然后,就可以创建一个“过渡图”了,基本上是相反的方式。索引 0 (2) 处的新元素来自旧列表中的索引 1,因此转换映射的第一个元素将为 1,索引 1 (3) 处的元素来自旧列表中的索引 2,等等

transition_map = [1,2,3,0]

我实现了类似这样的东西来创建这些列表:

transition = np.empty(indices.shape, int)
transition_map = np.empty(indices.shape, int)
for i in range(len(old_indices)):
    for j in range(len(indices)):
        if old_indices[i] == indices[j]:
            transition[i] = j
            transition_map[transition[i]] = i

这可以正常创建这些列表。但是,如果我在每个索引列表(相同大小)中有数十万或数百万个元素,它就会开始花费更多时间。 我有 48 个处理器可用于此计算。 我想知道将其并行化并填充数组是否有益。但是,我没有使用 Python 3 进行并行化的经验。例如,我不知道我应该使用哪个工具,如果我用多个处理器填充同一个数组这一事实是否可能(甚至,如果通信时间太长而无法每次都同步阵列)。

谢谢!

快:O(n)

假设每个元素都存在于两者中,则此解决方案适用。为了加快这个过程,我们可以使用字典来跟踪索引,其中键是当前值,它对应于索引。为了使命名更容易理解,我将变量 before 称为转换,after,以便我们知道转换如何映射它。

# Setup test cases
before = [1, 2, 3, 0]
after = [2, 3, 0, 1]

# Create the dictionary
for i, v in enumerate(after):
    indices[v] = i

# Find the indices for the transition array
transitions = [indices[x] for x in before]

要找到您的 so-called transition_map,只需颠倒名称即可。

for i, v in enumerate(before):
    indices[v] = i

transition_map = [indices[x] for x in after]

任何问题或批评,请在评论中告诉我。