python - 查找公共(public)子数组的索引

标签 python arrays algorithm numpy

我有 2 个大型未排序数组(xyz 坐标的结构化集合),我试图找到所有相同子数组的位置(由 3 个坐标组成的公共(public)点)。示例:

a = array([[0, 1, 2], [3, 4, 5]])
b = array([[3, 4, 5], [6, 7, 8]])

这里正确的子数组应该是[3, 4, 5],但也可能有多个相同的子数组。 a 的正确索引为 [0,1]b 的正确索引为 [1,0]

我已经通过迭代一个数组的所有点并将它们与另一个数组的每个点进行比较来实现了一种纯 python 方法,但这非常慢。

我的问题是,是否有一种有效的方法来查找两个数组的索引(最好是在 numpy 中,因为我需要数组进行进一步计算)?也许是滚动窗口方法?

最佳答案

Python 可迭代的通用解决方案(不特定于 numpy 或数组),以线性平均时间工作(O(n+m),n 是子数组的数量,m 是唯一子数组的数量):

a = [[0, 1, 2], [3, 4, 5]]
b = [[3, 4, 5], [6, 7, 8]]

from collections import defaultdict

indexmap = defaultdict(list)

for row, sublist in enumerate((a, b)):
    for column, item in enumerate(sublist):
        indexmap[tuple(item)].append((row, column))

repeats = dict((key, value) for key, value in indexmap.iteritems() if len(value) > 1)

给予

{(3, 4, 5): [(0, 1), (1, 0)]}

如果您不需要双行索引(列表中的索引和存储的索引),您可以将循环简化为

for row in (a, b):
    for column, item in enumerate(sublist):
        indexmap[tuple(item)].append(column)

由于 a 将在 b 之前处理,任何重复项都会自动按行编号:

{(3, 4, 5): [1, 0]}

repeats[key][rownum] 返回该行的列索引。

关于python - 查找公共(public)子数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7492454/

相关文章:

python - 尝试将输入到条目小部件中的文本存储到变量中

python - 数组列表索引超出范围

javascript - 通过属性名称数组访问嵌套对象

c++ - N维网格顶点计算

java - 什么是链式矩阵乘法?

python - 在pivot_table pandas之后丢失值

python - 使用 Python 子进程执行 tar 命令在给定 --exclude 选项时不会排除某些文件

python - 根据标签关联图像的最佳方法

java - 无法从 START_OBJECT token 中反序列化 int[] 实例

c# - 研讨会注册算法 - 多个研讨会和回合