python numpy: как построить большой диагональный массив (матрицу) из двух небольших массивов

import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) C = np.array([[1, 2, 0, 0], [3, 4, 0, 0], [0, 0, 5, 6], [0, 0, 7, 8]]) 

Я хотел бы сделать C непосредственно из A и B , есть ли какие-либо простые способы построения диагонального массива C ? Благодарю.

One Solution collect form web for “python numpy: как построить большой диагональный массив (матрицу) из двух небольших массивов”

Подход №1: Один простой способ был бы с np.bmat

 Z = np.zeros((2,2),dtype=int) # Create off-diagonal zeros array out = np.asarray(np.bmat([[A, Z], [Z, B]])) 

Пример прогона –

 In [24]: Z = np.zeros((2,2),dtype=int) In [25]: np.asarray(np.bmat([[A, Z], [Z, B]])) Out[25]: array([[1, 2, 0, 0], [3, 4, 0, 0], [0, 0, 5, 6], [0, 0, 7, 8]]) 

Подход №2: для общего количества массивов мы можем использовать masking

 def diag_block_mat_boolindex(L): shp = L[0].shape mask = np.kron(np.eye(len(L)), np.ones(shp))==1 out = np.zeros(np.asarray(shp)*len(L),dtype=int) out[mask] = np.concatenate(L).ravel() return out 

Подход №3: для общего количества массивов, другой способ с multi-dimensional slicing

 def diag_block_mat_slicing(L): shp = L[0].shape N = len(L) r = range(N) out = np.zeros((N,shp[0],N,shp[1]),dtype=int) out[r,:,r,:] = L return out.reshape(np.asarray(shp)*N) 

Образцы прогона –

 In [137]: A = np.array([[1, 2], ...: [3, 4]]) ...: B = np.array([[5, 6], ...: [7, 8]]) ...: C = np.array([[11, 12], ...: [13, 14]]) ...: D = np.array([[15, 16], ...: [17, 18]]) ...: In [138]: diag_block_mat_boolindex((A,B,C,D)) Out[138]: array([[ 1, 2, 0, 0, 0, 0, 0, 0], [ 3, 4, 0, 0, 0, 0, 0, 0], [ 0, 0, 5, 6, 0, 0, 0, 0], [ 0, 0, 7, 8, 0, 0, 0, 0], [ 0, 0, 0, 0, 11, 12, 0, 0], [ 0, 0, 0, 0, 13, 14, 0, 0], [ 0, 0, 0, 0, 0, 0, 15, 16], [ 0, 0, 0, 0, 0, 0, 17, 18]]) In [139]: diag_block_mat_slicing((A,B,C,D)) Out[139]: array([[ 1, 2, 0, 0, 0, 0, 0, 0], [ 3, 4, 0, 0, 0, 0, 0, 0], [ 0, 0, 5, 6, 0, 0, 0, 0], [ 0, 0, 7, 8, 0, 0, 0, 0], [ 0, 0, 0, 0, 11, 12, 0, 0], [ 0, 0, 0, 0, 13, 14, 0, 0], [ 0, 0, 0, 0, 0, 0, 15, 16], [ 0, 0, 0, 0, 0, 0, 17, 18]]) 
  • Поиск индексов трех верхних значений через argmin () или min () в python / numpy без мутации списка?
  • Не удается прочитать numpy из libpgm
  • scipy stats геометрический средний возврат NaN
  • Преобразование 1D-массива в двумерную матрицу на основе класса python
  • Подкласс numpy ndarray не работает должным образом
  • Python apply_along_axis из нескольких массивов
  • Установка Numpy на Fedora 19 с помощью pip
  • Массивы NumPy с SQLite
  • Python - лучший язык программирования в мире.