我有一个约束变量,基于该变量我需要在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]
我需要以最有效的方式做到这一点。有人可以指导。谢谢
答案 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]])
还有其他方法可以更快地执行此操作,但应该相当容易遵循。