2D массив с 2D массивами по диагонали - PullRequest
1 голос
/ 12 апреля 2020

У меня есть матрица

J_plus = 
    [[ 0.0609698  -0.00022921 -0.00022921 ... -0.00022921 -0.00022921
    -0.00022921]
    [-0.00022921  0.0609698  -0.00022921 ... -0.00022921 -0.00022921
    -0.00022921]
    [-0.00022921 -0.00022921  0.0609698  ... -0.00022921 -0.00022921
    -0.00022921]
    ...
    [-0.00022921 -0.00022921 -0.00022921 ...  0.0609698  -0.00022921
    -0.00022921]
    [-0.00022921 -0.00022921 -0.00022921 ... -0.00022921  0.0609698
    -0.00022921]
    [-0.00022921 -0.00022921 -0.00022921 ... -0.00022921 -0.00022921
     0.0609698 ]]

и

J_minus: 
    [[ 4.46319168e-02 -8.94427191e-05 -8.94427191e-05 ... -8.94427191e-05
     -8.94427191e-05 -8.94427191e-05]
     [-8.94427191e-05  4.46319168e-02 -8.94427191e-05 ... -8.94427191e-05
     -8.94427191e-05 -8.94427191e-05]
     [-8.94427191e-05 -8.94427191e-05  4.46319168e-02 ... -8.94427191e-05
     -8.94427191e-05 -8.94427191e-05]
     ...
     [-8.94427191e-05 -8.94427191e-05 -8.94427191e-05 ...  4.46319168e-02
     -8.94427191e-05 -8.94427191e-05]
     [-8.94427191e-05 -8.94427191e-05 -8.94427191e-05 ... -8.94427191e-05
     4.46319168e-02 -8.94427191e-05]
     [-8.94427191e-05 -8.94427191e-05 -8.94427191e-05 ... -8.94427191e-05
     -8.94427191e-05  4.46319168e-02]]

как я могу создать матрицу

J = [[J_plus   0];
    [0        J_minus]]

, поэтому конечная матрица должна быть диагональной матрицей 2X2 с J_plus и J_minus в качестве диагональных элементов, подобных этому

J = [ J_plus    0;
    0         J_minus] 

в numpy?

1 Ответ

1 голос
/ 12 апреля 2020

Самый простой способ: scipy.linalg.block_diag:

linalg.block_diag(J_plus, J_minus)

Для подхода, основанного на numpy, мы могли бы использовать np.block. Хотя это определенно не тот способ go, когда речь идет о суммировании нескольких массивов:

px, py = J_plus.shape
mx, my = J_minus.shape

np.block([[J_plus,              np.zeros((px, my))], 
          [np.zeros((py, mx)),  J_minus]])

Например:

a = np.arange(16).reshape(4,4)
b = np.arange(24).reshape(4,6)

linalg.block_diag(a, b)

array([[ 0.,  1.,  2.,  3.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 4.,  5.,  6.,  7.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 8.,  9., 10., 11.,  0.,  0.,  0.,  0.,  0.,  0.],
       [12., 13., 14., 15.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.],
       [ 0.,  0.,  0.,  0.,  6.,  7.,  8.,  9., 10., 11.],
       [ 0.,  0.,  0.,  0., 12., 13., 14., 15., 16., 17.],
       [ 0.,  0.,  0.,  0., 18., 19., 20., 21., 22., 23.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...