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]]) 
  • Установка numpy Lion с Python 2.7?
  • python tilde унарный оператор как отрицательный numpy bool array
  • Почему numpy намного медленнее, чем Matlab на примере с цифрами?
  • Существует ли эквивалент Python диапазона (n) для многомерных диапазонов?
  • Регрессия по размеру в массиве numpy
  • Python: обработка большого набора данных. Scipy или Rpy? И как?
  • Как установить numpy + mkl для python 2.7 на Windows 64 бит?
  • как маскировать данные конкретного массива на основе шейп-файла
  • Python: Есть ли инверсия для ndarray.flatten ('F')?
  • Внедрение комплексного сравнения чисел в Python?
  • Правильный способ получения доверительного интервала с помощью scipy
  •  
    Interesting Posts for Van-Lav

    Невозможная ошибка в программе, которая выравнивает богатство в группе (UVA 10137, «The Trip»)

    Почему некоторые соединения mysql выбирают старые данные в базе данных mysql после удаления + вставки?

    Как запустить несколько заданий в одном Sparkcontext из отдельных потоков в PySpark?

    pyserial serialwin32.py имеет ошибку атрибута

    Попытка воссоздать метод __str __ () в python

    Как я могу реализовать asyncio websockets в классе?

    z3python: преобразование строки в выражение

    Как сканировать веб-сайт или извлекать данные в базу данных с помощью python?

    Django Tastypie – фильтрация ресурса ToManyField с параметром URL

    Отправка пакетов из pcap с измененным src / dst в scapy

    Python – Numpy: Как я могу одновременно выбрать все нечетные строки и все четные столбцы массива

    Публикация значений формы html в скрипте python

    Используйте один пакет сайта (как исключение) для виртуального

    Трудный импорт .dat-файла

    Как найти позицию элемента в списке, в Python?

    Python - лучший язык программирования в мире.