【发布时间】:2021-01-11 03:57:06
【问题描述】:
我想找到一种有效的方法来检索数组中与特定模式匹配的所有元素。
例如,考虑到我有:
-
由不同大小的子数组组成的数组
M:M = [[0, 1], [3, 2, 4], [3, 8], [9], [0, 2], [3, 1], [0, 3], [2, 4], [3, 7]] -
子数组的模式。例如,
[[a, b], [a, c], [a, d]]匹配[[0, 1], [0, 2], [0, 3]]。
如何返回M中与模式对应的所有元素?
到目前为止,我一直在使用 for 循环来查找匹配元素,但是当模式具有超过 2 个子数组时,这种幼稚的方法变得非常昂贵。
例子:
M = [[0, 1], [3, 2, 4], [3, 8], [9], [0, 2], [3, 1], [0, 3], [2, 4], [3, 7]]
# pattern with 3 sub-arrays -> [[a, b], [a, c], [a, d]]
for i, arr1 in enumerate(M):
for j, arr2 in enumerate(M):
for k, arr3 in enumerate(M):
if i != j != k:
if len(arr1) == len(arr2) == len(arr3) == 2:
a1, a2, a3 = arr1[0], arr2[0], arr3[0]
b, c, d = arr1[1], arr2[1], arr3[1]
if a1 == a2 == a3 and b < c < d:
print arr1, arr2, arr3
输出:
[0,1], [0,2], [0,3]
[3,1], [3,7], [3,8]
由于每个子数组都包含一个额外的嵌套循环,因此该方法的时间复杂度(O(n^k) 其中k 是子数组的数量)成为一个问题。
是否可以加快这个过程?如果有,怎么做?
【问题讨论】:
-
这几乎与numpy无关。 Numpy 不允许参差不齐的数组。
-
我不太明白你在用这个模式做什么。如果你遇到一个只有一个元素的子数组会发生什么?
-
用“if len(arr) == 2”过滤掉。如何使子数组具有相同的大小,例如用 NaN 填充它们。 == 的条件语句应该仍然有效。
-
如果你做一个不参差不齐的数组,实际使用numpy,并正确地进行向量化,你会看到速度有巨大的提升
-
[3, 1], [3, 7], [3, 8]怎么匹配?
标签: python optimization pattern-matching