我正在寻找生成相对大量数组的笛卡尔积,以跨越一个高维网格。由于维数高,无法将笛卡尔积计算的结果存储在内存中;而是将其写入硬盘。由于这种限制,我需要访问中间结果,因为它们是生成的。到目前为止,我一直在做的是:

for x in xrange(0, 10):
    for y in xrange(0, 10):
        for z in xrange(0, 10):
            writeToHdd(x,y,z)

除了非常讨厌之外,它还不能扩展(即,这需要我编写与维度一样多的循环)。我尝试使用建议的解决方案here,但这是一个递归解决方案,因此在生成结果时,很难即时获得结果。除了每个维度都有一个硬编码的循环以外,还有什么“整洁”的方法可以做到这一点?

最佳答案

在纯Python中,您可以使用 itertools.product 生成可迭代集合的笛卡尔乘积。

>>> arrays = range(0, 2), range(4, 6), range(8, 10)
>>> list(itertools.product(*arrays))
[(0, 4, 8), (0, 4, 9), (0, 5, 8), (0, 5, 9), (1, 4, 8), (1, 4, 9), (1, 5, 8), (1, 5, 9)]

在Numpy中,您可以将 numpy.meshgrid (传递sparse=True以避免在内存中扩展乘积)与 numpy.ndindex 结合使用:
>>> arrays = np.arange(0, 2), np.arange(4, 6), np.arange(8, 10)
>>> grid = np.meshgrid(*arrays, sparse=True)
>>> [tuple(g[i] for g in grid) for i in np.ndindex(grid[0].shape)]
[(0, 4, 8), (0, 4, 9), (1, 4, 8), (1, 4, 9), (0, 5, 8), (0, 5, 9), (1, 5, 8), (1, 5, 9)]

关于python - 与维度无关的(通用)笛卡尔积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24648045/

10-12 21:14