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