サイズのnumpy配列があります
arr.size = (200, 600, 20).
scipy.stats.kendalltau
最後の 2 つの次元のすべてのペアごとの組み合わせを計算したいと思います。例えば:
kendalltau(arr[:, 0, 0], arr[:, 1, 0])
kendalltau(arr[:, 0, 0], arr[:, 1, 1])
kendalltau(arr[:, 0, 0], arr[:, 1, 2])
...
kendalltau(arr[:, 0, 0], arr[:, 2, 0])
kendalltau(arr[:, 0, 0], arr[:, 2, 1])
kendalltau(arr[:, 0, 0], arr[:, 2, 2])
...
...
kendalltau(arr[:, 598, 20], arr[:, 599, 20])
arr[:, i, xi]
とarr[:, j, xj]
とi < j
、のすべての組み合わせをカバーするようにxi in [0,20)
しxj in [0, 20)
ます。これは(600 choose 2) * 400
個別の計算ですが、0.002 s
私のマシンではそれぞれに時間がかかるため、マルチプロセッシング モジュールでは 1 日以上かかることはありません。
i<j
これらの列を (で)反復処理する最良の方法は何ですか? 私は次のようなことを避けるべきだと思います
for i in range(600):
for j in range(i+1, 600):
for xi in range(20):
for xj in range(20):
これを行う最もnumpythonicな方法は何ですか?
編集: Kendall Tauは質問にとってそれほど重要ではないため、タイトルを変更しました. 次のようなこともできることに気づきました
import itertools as it
for i, j in it.combinations(xrange(600), 2):
for xi, xj in product(xrange(20), xrange(20)):
しかし、numpy を使用した、より優れた、よりベクトル化された方法が必要です。