我有一个 numpy 大小的数组
arr.size = (200, 600, 20).
我想计算scipy.stats.kendalltau
最后两个维度的每个成对组合。例如:
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]
了 witharr[:, j, xj]
和i < j
,xi in [0,20)
的所有组合xj in [0, 20)
。这是(600 choose 2) * 400
单独的计算,但由于每个计算都需要0.002 s
在我的机器上进行,因此使用多处理模块所花费的时间不会超过一天。
遍历这些列(使用i<j
)的最佳方法是什么?我想我应该避免类似的事情
for i in range(600):
for j in range(i+1, 600):
for xi in range(20):
for xj in range(20):
这样做的最简单的方法是什么?
编辑:我更改了标题,因为 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 必须有一种更好、更矢量化的方式。