maxframe.tensor.fill_diagonal#
- maxframe.tensor.fill_diagonal(a, val, wrap=False)[源代码]#
填充任意维度张量的主对角线。
对于一个
a.ndim >= 2的张量 a,对角线是索引为a[i, ..., i]的位置列表。此函数会就地修改输入张量,不返回值。- 参数:
a (Tensor, at least 2-D.) -- 要填充其对角线的张量,它将被就地修改。
val (scalar) -- 要写入对角线的值,其类型必须与张量 a 的类型兼容。
wrap (bool) -- 对于 NumPy 1.6.2 及更早版本中的高矩阵,对角线在 N 列后会“换行”。你可以通过此选项获得这种行为。这仅影响高矩阵。
参见
diag_indices,diag_indices_from备注
此功能可以通过 diag_indices 实现,但内部版本使用了一种更快速的实现方式,它从不构造索引,而是使用简单的切片。
示例
>>> import maxframe.tensor as mt >>> a = mt.zeros((3, 3), int) >>> mt.fill_diagonal(a, 5) >>> a.execute() array([[5, 0, 0], [0, 5, 0], [0, 0, 5]])
同一函数可以作用于 4 维张量:
>>> a = mt.zeros((3, 3, 3, 3), int) >>> mt.fill_diagonal(a, 4)
为了清晰起见,我们只显示几个块:
>>> a[0, 0].execute() array([[4, 0, 0], [0, 0, 0], [0, 0, 0]]) >>> a[1, 1].execute() array([[0, 0, 0], [0, 4, 0], [0, 0, 0]]) >>> a[2, 2].execute() array([[0, 0, 0], [0, 0, 0], [0, 0, 4]])
wrap 选项仅影响高矩阵:
>>> # tall matrices no wrap >>> a = mt.zeros((5, 3), int) >>> mt.fill_diagonal(a, 4) >>> a.execute() array([[4, 0, 0], [0, 4, 0], [0, 0, 4], [0, 0, 0], [0, 0, 0]])
>>> # tall matrices wrap >>> a = mt.zeros((5, 3), int) >>> mt.fill_diagonal(a, 4, wrap=True) >>> a.execute() array([[4, 0, 0], [0, 4, 0], [0, 0, 4], [0, 0, 0], [4, 0, 0]])
>>> # wide matrices >>> a = mt.zeros((3, 5), int) >>> mt.fill_diagonal(a, 4, wrap=True) >>> a.execute() array([[4, 0, 0, 0, 0], [0, 4, 0, 0, 0], [0, 0, 4, 0, 0]])
可以通过使用 numpy.flipud 或 numpy.fliplr 反转元素顺序来填充反对角线。
>>> a = mt.zeros((3, 3), int) >>> mt.fill_diagonal(mt.fliplr(a), [1,2,3]) # Horizontal flip >>> a.execute() array([[0, 0, 1], [0, 2, 0], [3, 0, 0]]) >>> mt.fill_diagonal(mt.flipud(a), [1,2,3]) # Vertical flip >>> a.execute() array([[0, 0, 3], [0, 2, 0], [1, 0, 0]])
请注意,对角线填充的顺序取决于所使用的翻转函数。