1. ホーム
  2. python

[解決済み] numpyを使用して2つの配列のすべての組み合わせの配列を構築する

2022-04-28 17:31:26

質問

複雑なことをする前に、6パラメータ関数のパラメータ空間を調べて、数値的な挙動を調べたいので、これを実行する効率的な方法を探しています。

私の関数は、6次元のnumpy配列で与えられたfloat値を入力として受け取ります。私が最初に行おうとしたことは、次のようなことでした。

まず、2つの配列を受け取り、2つの配列の値のすべての組み合わせで配列を生成する関数を作りました。

from numpy import *
def comb(a,b):
    c = []
    for i in a:
        for j in b:
            c.append(r_[i,j])
    return c

次に reduce() を使用して、同じ配列の m 個のコピーに適用します。

def combs(a,m):
    return reduce(comb,[a]*m)

最後に、このような関数を評価する。

values = combs(np.arange(0,1,0.1),6)
for val in values:
    print F(val)

これは動作しますが 方法 が遅すぎる。パラメータの空間が巨大であることは分かっていますが、これほど遅くはないはずです。私は10個しかサンプリングしていない 6 (100万)点の配列を作成するだけで、15秒以上かかりました。 values .

numpyでもっと効率的な方法はないでしょうか?

を変更することができます。 F は、必要であれば引数を取ります。

どのように解決するのですか?

の新しいバージョンでは numpy (>1.8.x)です。 numpy.meshgrid() は、より高速な実装を提供します。

pvのソリューション

In [113]:

%timeit cartesian(([1, 2, 3], [4, 5], [6, 7]))
10000 loops, best of 3: 135 µs per loop
In [114]:

cartesian(([1, 2, 3], [4, 5], [6, 7]))

Out[114]:
array([[1, 4, 6],
       [1, 4, 7],
       [1, 5, 6],
       [1, 5, 7],
       [2, 4, 6],
       [2, 4, 7],
       [2, 5, 6],
       [2, 5, 7],
       [3, 4, 6],
       [3, 4, 7],
       [3, 5, 6],
       [3, 5, 7]])

numpy.meshgrid() は2Dのみでしたが、NDが可能になりました。この場合、3Dです。

In [115]:

%timeit np.array(np.meshgrid([1, 2, 3], [4, 5], [6, 7])).T.reshape(-1,3)
10000 loops, best of 3: 74.1 µs per loop
In [116]:

np.array(np.meshgrid([1, 2, 3], [4, 5], [6, 7])).T.reshape(-1,3)

Out[116]:
array([[1, 4, 6],
       [1, 5, 6],
       [2, 4, 6],
       [2, 5, 6],
       [3, 4, 6],
       [3, 5, 6],
       [1, 4, 7],
       [1, 5, 7],
       [2, 4, 7],
       [2, 5, 7],
       [3, 4, 7],
       [3, 5, 7]])

最終的な結果の順序が少し違うことに注意してください。