Первое исправление вашего кода относится к -w_estimate[1:4]
. Поскольку w_estimate является простым списком pythoni c, вы не можете применять к нему оператор минус .
Однако вы можете применить * 1010 Оператор * минус в массив Numpy.
Еще одно исправление - избежать -0 в результате. Чтобы получить массив с диагональными элементами, заполненными из другого массива, и всеми другими нулями, вы можете использовать np.diagonal_fill , который заполняет диагональные элементы на месте некоторого (ранее) созданного массива (используя np.zeros ).
Итак, чтобы построить 2 «верхних» блока вашего результата, вы можете написать:
a1 = np.zeros((3,3))
a2 = a1.copy()
np.fill_diagonal(a1, -np.array(w_estimate)[1:4])
np.fill_diagonal(a2, -1)
Обратите внимание, что -np.array(w_estimate)[1:4]
возвращает последние 2 элемента w_estimate их, т.е. [7.192304, 2.749036] . Поскольку целевой массив равен «3 на 3», исходная последовательность повторяется (в данном случае только для последнего диагонального элемента).
Если ваше намерение иное, измените -np.array(w_estimate)[1:4]
соответственно.
И чтобы построить весь предполагаемый массив, запустите:
F = np.vstack((np.hstack((a1, a2)), np.zeros((3,6))))
Результат:
array([[-7.192304, 0. , 0. , -1. , 0. , 0. ],
[ 0. , -2.749036, 0. , 0. , -1. , 0. ],
[ 0. , 0. , -7.192304, 0. , 0. , -1. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ]])