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.flipudnumpy.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]])

请注意,对角线填充的顺序取决于所使用的翻转函数。