问题:
给定一组数字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 :(得分:4)
L = list(itertools.combinations(S, 2))
如果您想将其拆开,文档会详细说明实现。
将它应用到您拥有的对象列表中非常容易:
for i, j in itertools.combinations(L, 2):
i.function(j)
答案 1 :(得分:1)
如果通过“矢量化”,则表示“内部循环发生在numpy
C代码”中:
scipy.misc.comb
是生成组合的最简单方法。
对于所有L[i], L[j]
,i != j
,或者您正在考虑的其他任何情况,i < j
操作的更一般情况,有几种方法可以做到 - 你可以显式使用broadcast
,或者你可以用L创建一个“列向量”和一个“行向量”并只执行操作,或者你可以创建一个L的移位副本的二维数组并应用对此采取行动,或......这实际上取决于你正在做什么。