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])
4

2 回答 2

4

改用itertools.combinations()

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

如果您想将其分开,文档会详细说明实现。

将其应用于您拥有的对象列表很容易:

for i, j in itertools.combinations(L, 2):
    i.function(j)
于 2013-03-18T18:32:43.390 回答
1

如果“矢量化”是指“内部循环发生在numpyC 代码中”:

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

对于对L[i], L[j]all i != j、 ori < j或您正在考虑的任何其他情况进行操作的更一般情况,有几种方法可以做到这一点——您可以显式使用broadcast,或者您可以创建一个“列向量”和一个“行-vector" 从 L 中取出并执行操作,或者您可以创建 L 的移位副本的 2D 数组并对其应用操作,或者……这实际上取决于您在做什么。

于 2013-03-18T18:37:56.710 回答