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()因为它需要整个数组才能获得对角线。
答案 0 :(得分:2)
根据您的说明,np.where
,np.diagonal
和np.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]