我有一个大小为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]
和arr[:, j, xj]
(其中i < j
并且xi在[0,20)
,xj在[0,20)
)的组合。这将需要进行(600 choose 2) * 400
个单独的计算, 但由于我的机器每个计算只需约0.002 s
, 所以使用多进程模块不会花费太长时间,大约一天左右。
如何迭代这些列(其中j)最好的方法是什么?我认为应该避免像下面这样的操作:
for i in range(600):
for j in range(i+1, 600):
for xi in range(20):
for xj in range(20):
什么是最符合Python风格的方式来处理这个问题?
编辑:我改变了标题,因为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进行向量化处理。
numpy
。 - wflynny