Python 元组是另一个元组的子集-Apriori算法

Python 元组是另一个元组的子集-Apriori算法,python,tuples,jupyter-notebook,subset,apriori,Python,Tuples,Jupyter Notebook,Subset,Apriori,我正在尝试实现apriori算法。在最后的一个步骤中,我有两个从产品列表生成的元组数组 >>> arr1 = array([(2421,), (35682,), (30690,), ..., (18622,), (18285,), (31269,)], dtype=object) >>> arr2 = array([(2421, 35682), (2421, 30690), (2421, 24852), ..., (18622, 18285), (

我正在尝试实现apriori算法。在最后的一个步骤中,我有两个从产品列表生成的元组数组

>>> arr1 = array([(2421,), (35682,), (30690,), ..., (18622,), (18285,), (31269,)],
  dtype=object)

>>> arr2 = array([(2421, 35682), (2421, 30690), (2421, 24852), ..., (18622, 18285),
   (18622, 31269), (18285, 31269)], dtype=object))
我的想法是,我需要检查
arr1
中的哪一个是
arr2
的子偶,即
(2421,)
(242130690)
的子偶

我试过了

>>> if (2421,) in (2421, 1231):
...    print('Yes')
... else:
...    print('No')
我得到了
没有
。我也尝试过使用
.issubset
,但我得到了
AtributeError

我想知道我怎样才能不走极端

>>> print(len(arr1), len(arr2))
(9258, 263616)
我正在使用Python2的Jupyter笔记本。仅使用numpy、pandas和itertools


所需输出应为以下形式:;如果我的产品有代码>1,2,3,< /代码>,但我只考虑元组<代码>(1)和<代码>(2),那么我需要从所有的2个组合组合中得到<代码>(1,2)< /代码>,而不是<代码>(1,3)< /代码>。< / P> < P>如果您正在实施Apriori算法,则希望使用实际集而不是元组。Python有两种集合类型,后者是不可变的,因此可以存储在字典或其他集合中。您可能希望使用后者,以便将这些集合与支持分数相关联

>>> arr1 = array([(2421,), (35682,), (30690,), ..., (18622,), (18285,), (31269,)],
  dtype=object)

>>> arr2 = array([(2421, 35682), (2421, 30690), (2421, 24852), ..., (18622, 18285),
   (18622, 31269), (18285, 31269)], dtype=object))
这当然是他们使用的方法
apyory
是Apriori算法的纯Python库

您可以使用元组进行子集测试,但对于大小为N和M的元组,这是一个缓慢的O(NM)操作:

def tuple_is_subset(ta, tb):
    return all(tav in tb for tav in ta)
这是对
ta
中N个项目的完整循环,tb测试中的每个
tav都需要M=
len(tb)
步骤

您可以将元组转换为集合,但这也需要O(N)+O(M)时间,之后子集测试需要O(N)时间。这使得整个过程需要线性时间,但对于小元组,我怀疑创建新对象的恒定成本将超过上面理论上成本更高的O(NM)
all()
test

要使用集合,可以使用:

set(ta).issubset(tb)
如果
set.issubset()
接受任何非set iterable,则代码将为测试创建一个临时set对象。

欢迎

初始化

>>> arr1 =  np.array([(2421,), (35682,), (30690,),(18622,), (18285,), (31269,)], dtype=object)
>>> arr2 = np.array([(2421, 35682), (2421, 30690), (2421, 24852), (18622, 18285), (18622, 31269), (18285, 31269)], dtype=object)
因此,如果您试图询问
(2421,)
它是
arr2
仅当
arr2
包含大小为1的元组并包含值
2421
时,才会返回
True

由于这不是您预期的行为,您必须迭代
arr1
的每个
i
项,并检查所有
i[j]
项是否都是
arr2[k]

快速概述

>>> arr1[0]
array([2421], dtype=object)
>>> arr1[0] in arr2
True
>>> arr1[0] in arr2[0]
True
这可以赋予这个功能

def is_a_subset( tuple_i, primary_tuple ):
  return all( k in primary_tuple for k in tuple_i)

for tuple_i in arr1:
  is_a_subset( tuple_i , arr2)
但是如果你一步一步地构建你的集合,我会建议你使用set,如果它是一个不可变的集合(即)

编辑:
答案以相同的方式进行

其他元组中的sourcetuple
仅当整个元组包含在
其他元组中时才有效<((81,),(42,)
中的code>(42,)为真,因为第二个元组包含嵌套元组,其中一个元组等于所查找的元组。对于逐值测试,您可以使用
如果有的话(其他元组中的v表示sourcetuple中的v):
或使用集合,在这些集合中您可以使用实际的子集测试<代码>seta现在,我怀疑这是一个更大问题的一小部分,你认为你找到了解决方案。我怀疑可能有更好的方法,比如使用实际的集合。是的,@MartijnPieters我和一些同事谈过,他们告诉我用集合代替。谢谢你指出这一点!