回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我需要找到同一集合的两个分区之间的所有不同交点。例如,如果我们有相同集合的以下两个分区</p>
<pre><code>x = [[1, 2], [3, 4, 5], [6, 7, 8, 9, 10]]
y = [[1, 3, 6, 7], [2, 4, 5, 8, 9, 10]]
</code></pre>
<p>要求的结果是</p>
<p>[1],[2],[3],[4,5],[6,7],[8,9,10]</p>
<p>具体地说,我们计算x和y的每个子集之间的笛卡尔积,对于这些积中的每一个,我们相应地将元素分类到新的子集中,如果它们是否属于其相关子集的交集</p>
<p>做这件事的最佳方式是什么?提前谢谢</p>
<hr/>
<p>当前答案的性能比较:</p>
<pre><code>import numpy as np
def partitioning(alist, indices):
return [alist[i:j] for i, j in zip([0]+indices, indices+[None])]
total = 1000
sample1 = np.sort(np.random.choice(total, int(total/10), replace=False))
sample2 = np.sort(np.random.choice(total, int(total/2), replace=False))
a = partitioning(np.arange(total), list(sample1))
b = partitioning(np.arange(total), list(sample2))
def partition_decomposition_product_1(x, y):
out = []
for sublist1 in x:
d = {}
for val in sublist1:
for i, sublist2 in enumerate(y):
if val in sublist2:
d.setdefault(i, []).append(val)
out.extend(d.values())
return out
def partition_decomposition_product_2(x, y):
all_s = []
for sx in x:
for sy in y:
ss = list(filter(lambda x:x in sx, sy))
if ss:
all_s.append(ss)
return all_s
def partition_decomposition_product_3(x, y):
return [np.intersect1d(i,j) for i in x for j in y]
</code></pre>
<p>并使用%timeit测量执行时间</p>
<pre><code>%timeit partition_decomposition_product_1(a, b)
%timeit partition_decomposition_product_2(a, b)
%timeit partition_decomposition_product_3(a, b)
</code></pre>
<p>我们发现</p>
<pre><code>2.16 s ± 246 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
620 ms ± 84.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.03 s ± 111 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
</code></pre>
<p>因此,第二种解决方案是最快的</p>