numpy.diagonal#

numpy.diagonal(a, offset=0, axis1=0, axis2=1)[source]#

返回指定的对角线。

如果a是二维的,则返回a具有给定偏移量的主对角线,即,形式为a[i, i+offset]的元素的集合。如果a具有两个以上的维度,则由axis1axis2指定的轴用于确定返回其对角线的二维子数组。结果数组的形状可以通过删除axis1axis2并在右侧附加一个等于所得对角线大小的索引来确定。

在1.7之前的NumPy版本中,此函数始终返回一个新的、独立的数组,其中包含对角线中值的副本。

在NumPy 1.7和1.8中,它继续返回对角线的副本,但是依赖于此事实已被弃用。写入结果数组仍然像以前一样工作,但是会发出FutureWarning。

从NumPy 1.9开始,它返回原始数组的只读视图。尝试写入结果数组将产生错误。

在将来的某个版本中,它将返回一个读/写视图,并且写入返回的数组将更改原始数组。返回的数组将与输入数组具有相同的类型。

如果您不写入此函数返回的数组,那么您可以忽略以上所有内容。

如果您依赖于当前行为,那么我们建议显式复制返回的数组,即使用np.diagonal(a).copy()而不是np.diagonal(a)。这将适用于过去和将来的NumPy版本。

参数:
aarray_like

从中获取对角线的数组。

offsetint, 可选

对角线相对于主对角线的偏移量。可以是正数或负数。默认为主对角线 (0)。

axis1int, 可选

用作应从中获取对角线的二维子数组的第一轴的轴。默认为第一轴 (0)。

axis2int, 可选

用作应从中获取对角线的二维子数组的第二轴的轴。默认为第二轴 (1)。

返回:
array_of_diagonalsndarray

如果a是二维的,则返回一个包含对角线且与a类型相同的1D数组,除非amatrix,在这种情况下,为了保持向后兼容性,返回的是一个1D数组而不是一个(2D)matrix

如果a.ndim > 2,则删除由axis1axis2指定的维度,并在末尾插入一个对应于对角线的新轴。

引发:
ValueError

如果a的维度小于2。

另请参见

diag

适用于一维和二维数组的MATLAB类似函数。

diagflat

创建对角线数组。

trace

沿对角线求和。

示例

>>> import numpy as np
>>> a = np.arange(4).reshape(2,2)
>>> a
array([[0, 1],
       [2, 3]])
>>> a.diagonal()
array([0, 3])
>>> a.diagonal(1)
array([1])

一个三维示例

>>> a = np.arange(8).reshape(2,2,2); a
array([[[0, 1],
        [2, 3]],
       [[4, 5],
        [6, 7]]])
>>> a.diagonal(0,  # Main diagonals of two arrays created by skipping
...            0,  # across the outer(left)-most axis last and
...            1)  # the "middle" (row) axis first.
array([[0, 6],
       [1, 7]])

我们刚刚获得其主对角线的子数组;请注意,每个子数组都对应于固定最右边的(列)轴,并且对角线按行“打包”。

>>> a[:,:,0]  # main diagonal is [0 6]
array([[0, 2],
       [4, 6]])
>>> a[:,:,1]  # main diagonal is [1 7]
array([[1, 3],
       [5, 7]])

可以使用numpy.flipudnumpy.fliplr反转元素顺序来获得反对角线。

>>> a = np.arange(9).reshape(3, 3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> np.fliplr(a).diagonal()  # Horizontal flip
array([2, 4, 6])
>>> np.flipud(a).diagonal()  # Vertical flip
array([6, 4, 2])

请注意,检索对角线的顺序取决于翻转函数。