Numpy: функция, которая создает блочные матрицы - PullRequest
0 голосов
/ 12 июня 2018

Скажите, у меня есть размер k.Я ищу функцию, которая принимает k в качестве входных данных и возвращает следующую матрицу блоков.

Пусть I будет k-мерной единичной матрицей, а 0 будет k-мерной квадратной матрицей нулей

То есть:

def function(k):
...
return matrix 

function(2) -> np.array([I, 0])

function(3) -> np.array([[I,0,0]
                         [0,I,0]])

function(4) -> np.array([[I,0,0,0]
                         [0,I,0,0],
                         [0,0,I,0]])

function(5) -> np.array([[I,0,0,0,0]
                         [0,I,0,0,0],
                         [0,0,I,0,0],
                         [0,0,0,I,0]])

То естьна выходе получается (k-1, k) матрица, где единичные матрицы находятся на диагональных элементах и ​​нулевые матрицы в других местах.

Что я пробовал:

Я знаю, как создать любого человекая просто не могу придумать, как поместить его в функцию, чтобы она взяла измерение k и выполнила нужную мне матрицу.

например,

np.block([[np.eye(3),np.zeros((3, 3)),np.zeros((3, 3))],
          [np.zeros((3, 3)),np.eye(3),np.zeros((3, 3))]])

Будет желаемым выводом для k = 3

scipy.linalg.block_diag похоже, что он может быть на правильном пути ...

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

IMO, np.eye уже имеет все необходимое, так как вы можете определить количество строк и столбцов отдельно.
Таким образом, ваша функция должна просто выглядеть как

def fct(k):
    return np.eye(k**2-k, k**2)
0 голосов
/ 12 июня 2018

Если я правильно вас понимаю, это должно сработать:

a = np.concatenate((np.eye((k-1)*k),np.zeros([(k-1)*k,k])), axis=1)

(по крайней мере, когда я установлю k=3 и сравню с выражением np.block(...), которое вы дали, оба результата идентичны)

0 голосов
/ 12 июня 2018

IIUC, вы также можете попробовать np.fill_diagonal, чтобы создать правильную форму матриц и заполнить диагональные части.

def make_block(k):
    arr = np.zeros(((k-1)*k, k*k))
    np.fill_diagonal(arr, 1)
    return arr
0 голосов
/ 12 июня 2018

Есть два толкования вашего вопроса.Во-первых, вы в основном создаете матрицу вида [[1, 0, 0], [0, 1, 0]], которую можно математически представить как [I 0], а в другом - каждый элемент содержит свою собственную цифруполностью массив (что снижает вычислительные возможности, но может быть тем, что вы хотите).

Первый: np.append(np.eye(k-1), np,zeros((k-1, 1)), axis=1)

Последний (немного сложнее):

I = np.eye(m) #Whatever dimensions you want, although probably m==n
Z = np.eye(n) 
arr = np.zeros((k-1, k)
for i in range(k-1):
    for j in range(k):
        if i == j:
            arr[i,j] = np.array(I)
        else:
            arr[i,j] = np.array(Z)

Я действительно понятия не имею, как будет полезен второй, поэтому я думаю, что вы можете быть немного смущены фундаментальной структурой блочной матрицы, если вы этого хотите.Обычно [A b], например, с A, являющимся матрицей, и b, являющимся вектором, обычно рассматривается как представляющий одну матрицу, причем для простоты просто существует блочная нотация.Надеюсь, это поможет!

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