回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个核大小的数组</p>
<pre><code>arr.size = (200, 600, 20).
</code></pre>
<p>我想计算最后两个维度的每个成对组合上的<code>scipy.stats.kendalltau</code>。例如:</p>
<pre><code>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])
</code></pre>
<p>这样我就涵盖了<code>arr[:, i, xi]</code>与<code>arr[:, j, xj]</code>与<code>i < j</code>和<code>xi in [0,20)</code>,<code>xj in [0, 20)</code>的所有组合。这是<code>(600 choose 2) * 400</code>单独的计算,但是由于在我的机器上每个计算大约需要<code>0.002 s</code>,所以使用多处理模块的时间不应该超过一天。</p>
<p>遍历这些列(使用<code>i<j</code>)的最佳方法是什么?我想我应该避免</p>
<pre><code>for i in range(600):
for j in range(i+1, 600):
for xi in range(20):
for xj in range(20):
</code></pre>
<p>做这件事最重要的方法是什么?</p>
<p><strong>编辑:</strong>我更改了标题,因为Kendall Tau对问题并不重要。我知道我也可以做些</p>
<pre><code>import itertools as it
for i, j in it.combinations(xrange(600), 2):
for xi, xj in product(xrange(20), xrange(20)):
</code></pre>
<p>但有一个更好的,更矢量化的方式与numpy。</p>