1. 程式人生 > 程式設計 >python 實現方陣的對角線遍歷示例

python 實現方陣的對角線遍歷示例

任務描述

對一個方陣矩陣,實現平行於主對角線方向的對角線元素遍歷。

從矩陣索引入手:

[[ 1 2 3 4 5]
 [ 6 7 8 9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]
 [21 22 23 24 25]]

上三角的索引遍歷:

0 0
1 1
2 2
3 3
4 4

0 1
1 2
2 3
3 4

0 2
1 3
2 4

0 3
1 4

0 4

下三角的索引遍歷:

1 0
2 1
3 2
4 3

2 0
3 1
4 2

3 0
4 1

4 0

程式碼

import numpy as np

A = np.arange(25)+1
A = np.mat(A.reshape([5,5]))
print(A)

"""
[[ 1 2 3 4 5]
 [ 6 7 8 9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]
 [21 22 23 24 25]]
"""

Num_element = A.shape[0]
c = int((Num_element-1)/2)
# print(c)


R = np.zeros_like(A)
# print(R)

for j in range(Num_element):
 print()
 i = 0
 # print(i,j)
 while np.max([i,j])<Num_element:
 print(i,j)
 if np.abs(i-j)%2==0:
 R[i,j] = A[c-int((j-i)/2),c+int((j-i)/2)]
 else:
 R[i,j] = (A[c-int((j-i-1)/2),c+int((j-i+1)/2)]+A[c-int((j-i+1)/2),c+int((j-i-1)/2)])/2

 i=i+1
 j=j+1

# print(R)

for k in range(1,Num_element):
 print()
 i = 0
 # print(i,j)
 while np.max([k,i])<Num_element:
 print(k,i)
 if np.abs(k-i)%2==0:
 R[k,i] = A[c-int((i-k)/2),c+int((i-k)/2)]
 else:
 R[k,i] = (A[c-int((i-k-1)/2),c+int((i-k+1)/2)]+A[c-int((i-k+1)/2),c+int((i-k-1)/2)])/2

 k=k+1
 i=i+1

print(R)

上述程式碼中對於每條對角線的所有元素執行相同的賦值操作。

考慮將其中重複的部分封裝成函式:

def diag_opreation(k,i,Num_element,R,A):
 c = int((Num_element-1)/2)
 while np.max([k,c+int((i-k-1)/2)])/2
 
 k=k+1
 i=i+1
 return R

則程式碼變為:

for j in range(Num_element):
 print()
 i = 0
 # print(i,j)
 R = diag_opreation(i,j,A)

# print(R)

for k in range(1,j)
 R = diag_opreation(k,A)

print(R)

輸出結果為:

[[13 11 9 7 5]
 [15 13 11 9 7]
 [17 15 13 11 9]
 [19 17 15 13 11]
 [21 19 17 15 13]]

以上這篇python 實現方陣的對角線遍歷示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。