在Python中创建向量数组的笛卡尔乘积时,我遇到了一个问题。我有一个代码,它给出了r个变量上一个数字n的所有可能分区,并将其作为numpy数组返回。我想做的是能够任意多次调用该代码,然后生成一组所有可能的数组组合。
因此,举个例子,我可能会调用分区代码和每个连续调用(对于不同的参数集)
array([[2,0],[1,1],[2,0]])
array([[1,0],[0,1]])
array([[0,0]])
我想要的是能够返回设置的
array([[2,0],[1,0],[0,0]])
array([[2,0],[0,1],[0,0]])
array([[1,1],[1,0],[0,0]])
.....
要么作为一个整体数组,要么逐行返回(由于随着分区数量的增长,内存问题明显)。
以前我使用itertools.product解决了这个问题,并在PyPy下运行了代码。然而,由于项目的其他部分需要Numpy,我不得不从PyPy切换到标准python,我正试图通过使用Numpy来复制PyPy代码的速度。我已经大致完成了这项工作,但代码花了太多时间在数据类型之间进行更改,以便尝试将解决方案引导到一起,这对于实现来说是不切实际的。
我想知道是否有人能帮我提供一些指导,告诉我应该如何在Python中完成这项工作。
感谢
这应该会让你开始:
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)
最后一个维度必须相同。
显示结果:
a=np.array([[2,0],[1,1],[2,0]])
b=np.array([[1,0],[0,1]])
c=np.array([[0,0]])
print row_product(a,b,c)
[[[2 0]
[1 0]
[0 0]]
[[2 0]
[0 1]
[0 0]]
[[1 1]
[1 0]
[0 0]]
[[1 1]
[0 1]
[0 0]]
[[2 0]
[1 0]
[0 0]]
[[2 0]
[0 1]
[0 0]]]
这是一个3D阵列,其中唯一的组合位于最后两个轴上。看起来相当快,1M的独特组合大约需要1/6秒。