как собрать несколько матриц в единую матрицу? - PullRequest
0 голосов
/ 13 июля 2020

Мне нужно собрать несколько матриц в одну матрицу, например:

введите описание изображения здесь

У меня есть значения для матрицы, но я не могу заставить их выглядеть так, как на изображении - вместо этого мои значения в итоге складываются друг на друга в массиве. Как я могу go добиться того, чтобы мои матрицы выглядели как на изображении выше?

Мой код:

import numpy as np

w_estimate = [0.656540, 7.192304, 2.749036]

F = [np.identity(3) * -w_estimate[1:4], -np.identity(3)], [np.identity(3)*0, np.identity(3)*0]

Он должен выглядеть так:

F =  [[np.identity(3) * -w_estimate[1:4],  -np.identity(3)]
      [np.identity(3) * 0,              np.identity(3) * 0]]

но вместо этого это выглядит так:

[[np.identity(3) * -w_estimate[1:4]],
 [-np.identity(3)],
 [np.identity(3) * 0],
 [np.identity(3) * 0]]

Помощь очень приветствуется.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Первое исправление вашего кода относится к -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.      ]])
1 голос
/ 13 июля 2020

Вам обязательно стоит взглянуть на метод numpy .block .

>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
...     [A,               np.zeros((2, 3))],
...     [np.ones((3, 2)), B               ]
... ])
array([[2., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [1., 1., 3., 0., 0.],
       [1., 1., 0., 3., 0.],
       [1., 1., 0., 0., 3.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...