如何在numpy数组中生成给定模式的每个组合?

时间:2019-06-22 03:51:06

标签: python python-3.x numpy

我有一个约束变量,基于该变量我需要在numpy数组中生成所有可能的组合。

 length = 12
 x >= 4 , x <= 7
 Solution:
 array([[0,0,0,0,0,0,0,0,1,1,1,1],
        [0,0,0,1,1,1,1,1,1,0,0,0],
        ..... <every possible combination>
       ])
## I tried the below way but I am not sure how to obtain the desired result
np.tril(np.ones((12,12),int))

数组中1的总和应在4到7之间。一维数组或列表的长度应为12,并且1的值不应不相交,即[0,1,0,1,1,1 ,0,0,0,0,0,0,0]无效,因为模式1被0中断。这是有效的:[0,1,1,1,1,1,0,0,0,0,0,0]

我需要以最有效的方式做到这一点。有人可以指导。谢谢

1 个答案:

答案 0 :(得分:0)

我不知道任何特殊功能,但是下面的test(...)在我的机器上以149us运行。如果您经常使用结果,请保存并根据需要从中复制。

def n_ones_in_len( n_ones, length ):
    """ Returns a diagonal with n ones offset by one column in each row. """
    n_rows = length - n_ones + 1
    res = np.zeros((n_rows, length), dtype = np.int)
    for start in range(n_rows):
        res[ start, start : start + n_ones] = 1
    return res

n_ones_in_len(4,12)
Out[5]:
array([[1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]])

使用此函数定义一个函数,以生成所有所需数量的1。

def test(lo, hi, length):
    """ Returns a numpy array with diagonals of lo to hi-1 ones in rows of length columns """
    res = np.empty((0,length), dtype = np.int) # Initialise res
    for ones in range(lo, hi):
        res = np.vstack((res, n_ones_in_len(ones, 12)))
        # Stack the new results to the res array
    return res

test(4, 8, 12)  # Note half open range.
Out[8]:
array([[1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       ...
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]])

还有其他方法可以更快地执行此操作,但应该相当容易遵循。