向量化对角矩阵数组的创建,

时间:2020-02-08 22:52:00

标签: python numpy numpy-ndarray array-broadcasting

我有一个称为对角线的二维数组,其中每一行代表一个二维矩阵的对角线。创建3d数组diag_matricies的最快/最好的方法是什么,其中最后两个维分别由使用对角线行创建的对角矩阵组成?

这是我想要的循环:

import numpy as np

diag_matricies = np.zeros([3,3,3])
diagonals = np.array([[1,2,3],[4,5,6],[7,8,9]])

for i in range(3):
    diag_matricies[i] = np.diag(diagonals[i,:]) 

print(diag_matricies)

2 个答案:

答案 0 :(得分:1)

一种更快的替代方法是使用advanced indexing

keyOfLastItemOnPreviousPage

计时,每个尺寸的大小为1200:

index = np.arange(3)
diag_matricies[:, index, index] = diagonals

[[[1. 0. 0.]
  [0. 2. 0.]
  [0. 0. 3.]]

 [[4. 0. 0.]
  [0. 5. 0.]
  [0. 0. 6.]]

 [[7. 0. 0.]
  [0. 8. 0.]
  [0. 0. 9.]]]

答案 1 :(得分:1)

您可以使用np.einsum

>>> out = np.zeros((3,3,3))
>>> np.einsum('ijj->ij',out)[...] = diagonals
>>> out
array([[[1., 0., 0.],
        [0., 2., 0.],
        [0., 0., 3.]],

       [[4., 0., 0.],
        [0., 5., 0.],
        [0., 0., 6.]],

       [[7., 0., 0.],
        [0., 8., 0.],
        [0., 0., 9.]]])

这实际上是以下内容:

>>> out2 = np.zeros((3,3,3))
>>> out2.reshape(3,9)[:,::4] = diagonals
>>> out2
array([[[1., 0., 0.],
        [0., 2., 0.],
        [0., 0., 3.]],

       [[4., 0., 0.],
        [0., 5., 0.],
        [0., 0., 6.]],

       [[7., 0., 0.],
        [0., 8., 0.],
        [0., 0., 9.]]])

einsum方法也适用于非连续数组。