Numpy数组:获取给定元素的上对角线和下对角线

时间:2018-03-23 14:44:13

标签: python arrays numpy

import numpy
square = numpy.reshape(range(0,16),(4,4))
square

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

在上面的数组中,如何访问任何给定元素的主对角线和次对角线?例如9。

主要对角线,我的意思是 - [4,9,14],
通过二级对角线,我的意思是 - [3,6,9,12]

我不能使用numpy.diag()因为它需要整个数组才能获得对角线。

2 个答案:

答案 0 :(得分:2)

根据您的说明,np.wherenp.diagonalnp.fliplr

import numpy as np
x,y=np.where(square==9)

np.diagonal(square, offset=-(x-y))
Out[382]: array([ 4,  9, 14])

x,y=np.where(np.fliplr(square)==9)
np.diagonal(np.fliplr(square), offset=-(x-y))
# base on the op's comment it should be np.diagonal(np.fliplr(square), offset=-(x-y))
Out[396]: array([ 3,  6,  9, 12]) 

答案 1 :(得分:0)

对于第一个对角线,使用x_coordiante和y_coordinate每步增加1的事实:

def first_diagonal(x, y, length_array):
     if x < y:
          return zip(range(x, length_array), range(length_array - x))
     else:
          return zip(range(length_array - y), range(y, length_array))

对于辅助对角线,请使用x_coordinate + y_coordinate = constant的事实。

def second_diagonal(x, y, length_array):
     tot = x + y
     return zip(range(tot+1), range(tot, -1, -1))

这为您提供了两个可用于访问矩阵的列表。 当然,如果你有一个非方阵,那么这些函数必须重新整形。

说明如何获得所需的输出:

a = np.reshape(range(0,16),(4,4))
first = first_diagonal(1, 2, len(a))
second = second_diagonal(1,2, len(a))
primary_diagonal = [a[i[0]][i[1]] for i in first]
secondary_diagonal = [a[i[0]][i[1]] for i in second]
print(primary_diagonal)
print(secondary_diagonal)

此输出:

[4, 9, 14]
[3, 6, 9, 12]