Skip to main content
 首页 » 编程设计

python之Python中所有向量组合的集合

2025年05月04日24daizhj

关于在 Python 中创建可视为向量数组的笛卡尔积的内容,我遇到了问题。我有一个代码,它给出了一个数字 n 在 r 个变量上的所有可能的分区,并将它作为一个 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 秒。