python - 从多形状数组的列创建对角矩阵

标签 python arrays numpy

假设我有一个像
mat = np.array([[1,1],[2,2],[3,3]])
它具有形状 (3,2)。我想通过获取数组的最后一个轴并从中创建对角矩阵来创建形状为 (3,2,2) 的新数组。我可以用 for 循环来做到这一点

mat2 = np.zeros((3,2,2))
for i in np.arange(0,3):
    mat2[i] = np.diag(mat[i])

产生所需的输出
[[[1. 0.]
  [0. 1.]]

 [[2. 0.]
  [0. 2.]]

 [[3. 0.]
  [0. 3.]]]

但是有没有办法在直接矢量化(更快?!)版本中做到这一点?在我的实际问题中,我有一个大的高维形状数组 (...,n),最后需要将最后一个轴转换为形状为 (...,n,n) 的对角矩阵。

最佳答案

这里有一个可能的实现:使用 np.diagonal查看相关的对角线并使用 setflags 强制该 View 可写,并写入 View :

expanded = np.zeros(mat.shape + mat.shape[-1:], dtype=mat.dtype)
diagonals = np.diagonal(expanded, axis1=-2, axis2=-1)
diagonals.setflags(write=True)

diagonals[:] = mat

expanded
array([[[1, 0],
        [0, 1]],

       [[2, 0],
        [0, 2]],

       [[3, 0],
        [0, 3]]])

关于python - 从多形状数组的列创建对角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60967861/

相关文章:

c - 为什么编译器不警告越界静态数组索引?

python - 如何向量化这个累积运算?

python - 绘制一个数组以及多个 pandas 列

python - 属性错误 : module 'paramiko.win_pageant' has no attribute 'can_talk_to_agent' when connecting using Paramiko from Windows Server

javascript - 如何迭代数组,提供对元素、索引和数组本身的访问,而不使用内置的 Javascript 函数

python - mac 无法安装spark

javascript - 将对象作为数组的数组进行垃圾收集

python - 二维中的离散或 bin LAB 颜色空间

python - 内置 iter() 函数和 for 语句

python - 从另一个类中删除一个对象