Создайте новую большую матрицу, сложив ее диагональные матрицы K - PullRequest
0 голосов
/ 07 февраля 2019

l имеет K (пусть K здесь будет 7) различает матрицы размерности (50,50).Я хотел бы создать новую матрицу L, заполнив ее по диагонали с помощью K матриц.Следовательно, L имеет размерность (50 * K, 50 * K).

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

K1=np.random.random((50,50)) 
N,N=K1.shape
K=7
out=np.zeros((K,N,K,N),K1.dtype)
np.einsum('ijik->ijk', out)[...] = K1
L=out.reshape(K*N, K*N) # L is of dimension (50*7,50*7)=(350,350)

Это действительно создает новую матрицу L путем стекированияК1 семь раз по диагонали.Однако я бы хотел сложить соответственно K1, K2, K3, K5, K6, K7, а не K1 семь раз.

Входы:

    K1=np.random.random((50,50)) 
    K2=np.random.random((50,50)) 
    K3=np.random.random((50,50)) 
    K4=np.random.random((50,50)) 
    K5=np.random.random((50,50)) 
    K6=np.random.random((50,50)) 
    K7=np.random.random((50,50)) 

    L=np.zeros((50*7,50*7))#

Ожидаемые результаты:

L[:50,:50]=K1
L[50:100,50:100]=K2
L[100:150,100:50]=K3
L[150:200,150:200]=K4
L[200:250,200:250]=K5
L[250:300,250:300]=K6
L[300:350,300:350]=K7

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вот способ сделать это с NumPy:

import numpy as np

def put_in_diagonals(a):
    n, rows, cols = a.shape
    b = np.zeros((n * rows, n * cols), dtype=a.dtype)
    a2 = a.reshape(-1, cols)
    ii, jj = np.indices(a2.shape)
    jj += (ii // rows) * cols
    b[ii, jj] = a2
    return b

# Test
a = np.arange(24).reshape(4, 2, 3)
print(put_in_diagonals(a))

Вывод:

[[ 0  1  2  0  0  0  0  0  0  0  0  0]
 [ 3  4  5  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  6  7  8  0  0  0  0  0  0]
 [ 0  0  0  9 10 11  0  0  0  0  0  0]
 [ 0  0  0  0  0  0 12 13 14  0  0  0]
 [ 0  0  0  0  0  0 15 16 17  0  0  0]
 [ 0  0  0  0  0  0  0  0  0 18 19 20]
 [ 0  0  0  0  0  0  0  0  0 21 22 23]]
0 голосов
/ 07 февраля 2019

Вы можете попробовать scipy.linalg.block_diag.Если вы посмотрите на источник, эта функция в основном просто перебирает заданные блоки так, как вы написали их в качестве выходных данных.Его можно использовать как:

K1=np.random.random((50,50)) 
K2=np.random.random((50,50)) 
K3=np.random.random((50,50)) 
K4=np.random.random((50,50)) 
K5=np.random.random((50,50)) 
K6=np.random.random((50,50)) 
K7=np.random.random((50,50)) 

L=sp.linalg.block_diag(K1,K2,K3,K4,K5,K6,K7)

Если у вас есть K в качестве ndarray формы (7,50,50), вы можете распаковать его напрямую как:

K=np.random.random((7,50,50))

L=sp.linalg.block_diag(*K)

Если вы неЕсли вы не хотите импортировать scipy, вы всегда можете просто написать простой цикл, чтобы сделать то, что вы написали для ожидаемого вывода.

...