2013-03-18 44 views
0

问题: 给定一组数字S_a={n1,n2,n3,...,na}产生的类型的数量的以下组合的:结合元件

{Sk,Sp}, where k=1...a, p=k+1,..,a 

人们可以容易地构建这种解决方案作为一个循环:

N = len(S) 
for i in range(0, N): 
    for j in range(i+1, N): 
       print("%d,%d" %(i,j)) 

但我正在寻找一个矢量化的解决方案。


这样做的另一个变化是考虑对象的列表:

class A: 
    def function(self, a): 
     pass 
L = [a1, a2, a3, a4, a5 ] 

#where a1,a2,an are of class A. 

如何写这个循环的向量化版本:

N = len(L)-1 
for i in range(0, N): 
    for j in range(i+1, N): 
     L[i].function(L[j]) 
+0

你是什么意思的“矢量化”?通常,在Python数值编程中,通过“向量化”人们意味着“内部循环发生在'numpy'C代码内部。但你在任何地方都没有任何'numpy',所以我怀疑你在这里的意思可能不同。 – abarnert 2013-03-18 18:33:59

+0

@abarnert是否倒下了你的?或者有人对这个问题的数学措词感到困惑? – 2013-03-18 18:40:30

+0

我没有对这个问题进行投票。特别是对于新用户,除非OP积极拒绝提供足够的信息以使其成为一个有用的问题,否则我通常不会冷静下来。 – abarnert 2013-03-18 18:54:11

回答

4

使用itertools.combinations()代替:

L = list(itertools.combinations(S, 2)) 

如果您想要将它分开,文档详细介绍了实现。

这是很容易的将其应用到对象的列表中,您有:

for i, j in itertools.combinations(L, 2): 
    i.function(j) 
+2

+1因为足够聪明可以知道他问了什么。 – Hoopdady 2013-03-18 18:33:53

+1

+1到@Hoopdady,但也是一个实际的答案+1,而不是只是说。 :) – abarnert 2013-03-18 18:38:19

+0

@abarnert正等着看它是否真的是答案......因为我不知道被问到的是什么。 :-) – Hoopdady 2013-03-18 18:39:47

1

如果“矢量”你的意思是“内循环发生在numpy C代码”:

scipy.misc.comb是最简单的方法来生成组合。

有关L[i], L[j]所有i != j,或i < j,或任何其他情况下,你正在考虑操作的更一般的情况下,有几个方法可以做到这一点,你可以明确地使用broadcast,也可以创建一个“列向量“和L行中的”行向量“,只是执行操作,或者您可以创建一个L的移位副本的二维数组,并将其应用于该操作,或者......这取决于您在做什么。