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