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