我认为你在这里缺少的是一种构建每个数组中存在的数字组合的方法,然后能够计算每个组合出现的次数。为此,您可以使用内置的 itertools module 之类的东西:
from itertools import combinations
import numpy as np
a = np.array([1,2,3])
for c in combinations(a, 2):
print(c)
>>> (1, 2)
>>> (1, 3)
>>> (2, 3)
因此,使用它,您可以为每个长度构建一个系列,并检查长度为 2 的每个组合发生了多少次,长度为 3 的每个组合发生了多少次等等。
import numpy as np
import pandas as pd
a=np.array([1,2,3])
b=np.array([])
c=np.array([2,3,4,5,6])
d=np.array([2,3,4,5,6,9,15])
e=np.array([5,6])
all_arrays = a, b, c, d, e
maxsize = max(array.size for array in all_arrays)
for length in range(2, maxsize+1):
length_N_combs = pd.Series(x for array in all_arrays for x in combinations(array, length) if array.size >= length)
counts = length_N_combs.value_counts()
print(counts[counts>1])
从这里您可以根据需要格式化输出。请注意,您必须排除太短的数组。我正在使用生成器理解来稍微提高效率,但请注意,这个算法无论如何都不会便宜,您需要进行大量比较。生成器推导式是一种将生成器表达式压缩为单行代码的方法(而且不止于此)。在这种情况下,上述嵌套理解大致相当于定义一个生成器,该生成器从 combinations 返回的生成器生成,并调用该生成器来构建 pandas 系列。这样的事情会给你同样的结果:
def length_N_combs_generator(arrays, length):
for array in arrays:
if array.size >= length:
yield from combinations(array, length)
for length in range(2, maxsize+1):
s = pd.Series(length_N_combs_generator(all_arrays, length))
counts = s.value_counts()
print(counts[counts>1])