如何将2d-numpy数组转换为填充0的对角矩阵?

vddsk6oq  于 2023-04-12  发布在  其他
关注(0)|答案(2)|浏览(156)

我不知道该怎么做,例如:

array([[1, 1],
       [2, 2],
       [3, 3]])

将其转换为:

array([[1, 1, 0, 0],
       [0, 2, 2, 0],
       [0, 0, 3, 3]])

np.diag只适用于1d数组到对角矩阵。我可以用for循环和切片的迭代方法得到它,但我觉得可能有更好的方法。

bfnvny8b

bfnvny8b1#

您可以使用高级索引与一些自我生成的索引:

import numpy as np

arr = np.array([[1, 1], [2, 2], [3, 3]])

h, w = arr.shape
w_out = h + w - 1

out = np.zeros((h, w_out), dtype=arr.dtype)

rows = np.arange(h)[:, None]
cols = rows + np.arange(w)

out[rows, cols] = arr

输出:

array([[1, 1, 0, 0],
       [0, 2, 2, 0],
       [0, 0, 3, 3]])

中间体:

>>> rows
array([[0],
       [1],
       [2]])
>>> cols
array([[0, 1],
       [1, 2],
       [2, 3]])
m3eecexj

m3eecexj2#

可以使用triutril Numpy函数

import numpy as np

x=np.array([[1],
       [2 ],
       [3]])
diagonal_length = len(x)
repeats = 2

y = x*np.ones(diagonal_length+(repeats-1))
print("Intermediate step:\n", y)

z = np.tril(np.triu(y,0),repeats-1)
print("\nOutput:\n",z)

这首先创建一个完整的网格,其 * 高度 * 是对角线长度,其 * 宽度 * 稍宽,以容纳多个对角线。

Intermediate step:
 [[1. 1. 1. 1.]
 [2. 2. 2. 2.]
 [3. 3. 3. 3.]]

然后使用triutril将非对角线区域归零。在上面的代码中,对角线的长度是根据您的输入自动计算的,您可以手动设置您想要的重复次数。

Output:
 [[1. 1. 0. 0.]
 [0. 2. 2. 0.]
 [0. 0. 3. 3.]]

相关问题