我不知道该怎么做,例如:
array([[1, 1], [2, 2], [3, 3]])
将其转换为:
array([[1, 1, 0, 0], [0, 2, 2, 0], [0, 0, 3, 3]])
np.diag只适用于1d数组到对角矩阵。我可以用for循环和切片的迭代方法得到它,但我觉得可能有更好的方法。
np.diag
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
输出:
中间体:
>>> rows array([[0], [1], [2]]) >>> cols array([[0, 1], [1, 2], [2, 3]])
m3eecexj2#
triu
tril
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.]]
然后使用triu和tril将非对角线区域归零。在上面的代码中,对角线的长度是根据您的输入自动计算的,您可以手动设置您想要的重复次数。
Output: [[1. 1. 0. 0.] [0. 2. 2. 0.] [0. 0. 3. 3.]]
2条答案
按热度按时间bfnvny8b1#
您可以使用高级索引与一些自我生成的索引:
输出:
中间体:
m3eecexj2#
可以使用
triu
和tril
Numpy函数这首先创建一个完整的网格,其 * 高度 * 是对角线长度,其 * 宽度 * 稍宽,以容纳多个对角线。
然后使用
triu
和tril
将非对角线区域归零。在上面的代码中,对角线的长度是根据您的输入自动计算的,您可以手动设置您想要的重复次数。