Было бы полезно использовать numpy.tile
?
N = 3
A = np.array([[0, *range(0, -N, -1)]]).T
B = np.tile(A, (1, N))
B[:,1] = -B[:,1]
В первой строке указывается ожидаемое количество строк после первой строки нулей.Второй создает массив NumPy, создавая начальное значение 0, за которым следует линейная последовательность от 0, -1, -2 до -N + 1
.Обратите внимание на использование оператора splat, который распаковывает объект range
и создает элементы в отдельном списке.Они объединяются с первым значением 0, и мы создаем двумерный массив NumPy, который является вектором столбца.Третья строка накладывает этот вектор N раз по горизонтали, чтобы получить желаемый результат.Наконец, четвертая строка отменяет второй столбец, чтобы получить желаемый результат
Пример выполнения
In [175]: N = 3
In [176]: A = np.array([[0, *range(0, -N, -1)]]).T
In [177]: B = np.tile(A, (1, N))
In [178]: B[:,1] = -B[:,1]
In [178]: B
Out[178]:
array([[ 0, 0, 0],
[ 0, 0, 0],
[-1, 1, -1],
[-2, 2, -2]])