Как создать каждую комбинацию данного шаблона в массиве NumPy? - PullRequest
0 голосов
/ 22 июня 2019

У меня есть переменная ограничения, на основе которой мне нужно генерировать каждую возможную комбинацию в массиве 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] недопустимо, поскольку шаблон 1 прерывается на 0. Этот действителен: [0,1,1,1,1,1,0,0,0,0,0,0]

Мне нужно это наиболее эффективным способом. Может кто-нибудь, пожалуйста, руководство. спасибо

1 Ответ

0 голосов
/ 23 июня 2019

Я не знаю никаких специальных функций, но тест (...), приведенный ниже, выполняется на моей машине в 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]])

Используйте эту функцию, чтобы определить функцию для генерации всех необходимых количеств единиц.

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]])

Существуют другие способы сделать это, которые могут быть быстрее, но за этим должно быть достаточно легко следовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...