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]for all i != j、 or 、または検討しているその他のケースの操作のより一般的なケースについてi < jは、いくつかの方法があります。明示的に を使用するbroadcastか、「列ベクトル」と「行」を作成できます。 -vector」を L から取り出して操作を実行するか、L のシフトされたコピーの 2D 配列を作成し、それに対して操作を適用するか、または…何をしているかによって異なります。

于 2013-03-18T18:37:56.710 に答える