値のペアからなるnumpy配列があるとします。私はそれらを裂くことなく、ペアのすべての組み合わせを見つけたいと思います。特に、私はこのためのnumpy.meshgrid
解決策を望んでいました。meshgridを介してペアのnumpy配列のすべての組み合わせを見つける
ように構成され配列想像
ab = np.array([[1,10], [2,20], [3,30], [4,40]])
は、その後、私の所望の出力が
>>> out: ([1,10], [2,20])
([1,10], [3,30])
([1,10], [4,40])
([2,20], [3,30])
([2,20], [4,40])
([3,30], [4,40])
ある出力が(私はそれに応じて後で変換することができる)np.array
、又はtuple
のいずれかであり得ます。私の結婚式の順序を無視して、私の結果に重複がどのように省かれているか注意してください([[1,10], [2,20]]
が既にある場合、私は[[2,20], [1,10]]
を私の出力に入れたくありません)。実際のケースでは、ab
のサイズは30,000ですから、速度も別の問題です。
私はまずmeshgridを試しました。単一の値の簡単なケースでは が、これは簡単に(重複してまだ、まだ)行われます
a = np.array([1,2,3,4])
mesh = np.array(np.meshgrid(a,a)).T.reshape(-1,2)
>>> out: [[1 1]
[1 2]
[1 3]
[1 4]
[2 1]
[...]
[4 4]]
しかし、私のペアのために、
mesh = np.array(np.meshgrid(ab,ab)).T
の私の試みは私に
[[[ 1 1]
[ 1 10]
[ 1 2]
[ 1 20]
[ 1 3]
[ 1 30]
[ 1 4]
[ 1 40]]
[[10 1]
[10 10]
[10 2]
[10 20]
...
[40 3]
[40 30]
[40 4]
[40 40]]]
を与える
つまり、meshgridは私のペアを分割します。私は解決策が近いと思うが、自分でそれを思いつくことはできなかった。どんな助けでも感謝しています!
あなたが望んでいた述べました'meshgrid'ソリューションですが、' itertools'はあまり冗長でなく、速い代替手段であると考えてください。 [permutations(ab)](https://docs.python.org/2/library/itertools)を呼びたいと思うでしょう。html)を使用して希望の出力を得る。 – charlesreid1
@ charlesreid1私は希望の結果を得るためには 'コンビネーション 'になると信じています。しかし実際には、itertoolsジェネレータをnumpy配列に変換するのが非常に遅いため、以下の解決法(itertoolsを使用しない方が速い)(特に大きな入力の場合)は高速です。 –
最初に 'itertools'を避けました。なぜなら、速度に関しては' meshgrid'の方が性能が優れているとよく読んでいるからです。より頻繁に計算されなければならないタスクの場合、私は確かに両方を試し、より速いものを見つけるでしょう。しかし、これは1回限りの仕事なので、私はDivakarの解決策に行くことに決めました。しかし、あなたもありがとう! – offeltoffel