Python中所有向量组合的集合

2024-04-25 07:11:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中创建向量数组的笛卡尔积时,我遇到了一个问题。我有一个代码,它给出了n除以r变量的所有可能的分区,并以numpy数组的形式返回它。我想做的是能够将该代码调用任意次数,然后生成一组所有可能的数组组合。在

所以举个例子,我可以调用分区代码和每个连续的调用(对于一个可变的参数集)

array([[2,0],[1,1],[2,0]])
array([[1,0],[0,1]])
array([[0,0]])

我要找的是能把这套还给我

^{pr2}$

或者作为一个整体数组,或者逐行返回它(因为随着被分区的数字的大小的增长,内存问题很明显)。在

以前我用itertools.product,并在PyPy下运行代码。但是,由于项目的其他部分需要Numpy,我不得不从PyPy切换到标准python,并且我试图通过使用Numpy来复制PyPy代码的速度。我已经设法使这个工作非常粗略,但代码花费了太多时间在数据类型之间进行更改,以便尝试将一个解决方案引导到一起,因此它对于实现来说是不切实际的。在

我想知道是否有人能帮我提供一些指导,告诉我如何在Python中使用它。在

谢谢


Tags: 代码numpy参数数字数组pypy次数array
1条回答
网友
1楼 · 发布于 2024-04-25 07:11:19

这应该让您开始:

import numpy as np
import itertools as it

def row_product(*arrays):
    lengths = np.array([x.shape[0] for x in arrays])
    positions = np.cumsum(lengths)

    ranges = np.arange(positions[-1])
    ranges = np.split(ranges,positions[:-1])

    total = np.concatenate((arrays),axis=0)

    inds = np.fromiter(it.chain.from_iterable(it.product(*ranges)), np.int)
    inds = inds.reshape(-1, len(arrays))

    return np.take(total, inds, axis=0)

最后一个维度必须相同。在

显示结果:

^{pr2}$

这是一个三维数组,在最后两个轴上有唯一的组合。似乎速度相当快,1M独特的组合大约需要1/6秒。在

相关问题 更多 >