Skip to main content
 首页 » 编程设计

python之Python/numpy 中的 n 维网格

2025年05月04日16qlqwjy

我有一个未知数量的 n 变量,它们的范围从 0 到 1,具有一些已知的步骤 s,条件是它们总和为 1。我想要创建所有组合的矩阵。例如,如果 n=3 和 s=0.33333 那么网格将是(顺序不重要):

0.00, 0.00, 1.00 
0.00, 0.33, 0.67 
0.00, 0.67, 0.33 
0.00, 1.00, 0.00 
0.33, 0.00, 0.67 
0.33, 0.33, 0.33 
0.33, 0.67, 0.00 
0.67, 0.00, 0.33 
0.67, 0.33, 0.00 
1.00, 0.00, 0.00 

我怎样才能为任意的 n 做到这一点?

请您参考如下方法:

这是一个使用 itertools.combinations 的直接方法:

>>> import itertools as it 
>>> import numpy as np 
>>>  
>>> # k is 1/s 
>>> n, k = 3, 3 
>>>  
>>> combs = np.array((*it.combinations(range(n+k-1), n-1),), int) 
>>> (np.diff(np.c_[np.full((len(combs),), -1), combs, np.full((len(combs),), n+k-1)]) - 1) / k 
array([[0.        , 0.        , 1.        ], 
       [0.        , 0.33333333, 0.66666667], 
       [0.        , 0.66666667, 0.33333333], 
       [0.        , 1.        , 0.        ], 
       [0.33333333, 0.        , 0.66666667], 
       [0.33333333, 0.33333333, 0.33333333], 
       [0.33333333, 0.66666667, 0.        ], 
       [0.66666667, 0.        , 0.33333333], 
       [0.66666667, 0.33333333, 0.        ], 
       [1.        , 0.        , 0.        ]]) 

如果速度是一个问题,itertools.combinations 可以替换为 numpy implementation .