python - 维度不可知(通用)笛卡尔积

标签 python arrays numpy cartesian-product

<分区>

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

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/

相关文章:

ios - 使用 if var = 快速修改数组

Javascript - 从数组中删除元素/对数组中高于特定值的元素求和

python - 如何在 matplotlib plt.polar 图中设置轴限制

python - 同情。如何检查输入是数字、sympy 表达式以及如果是的话表达式中是否包含符号?

python - 揭秘 Flask app.secret_key

javascript - 如何使用 python 截取给定 url 的屏幕截图

javascript/jquery : on click copy relevant array items to new array

python - 当 virtualenv 激活时设置 PYTHONPATH

java - linux 上哪种语言(python/perl/tcl)不需要安装第三方库?

python - 从 pandas 直方图数据帧计算平均值