python 实现方阵的对角线遍历示例

yipeiwu_com7年前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, 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
 return R

则代码变为:

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

# print(R)

for k in range(1, Num_element):
 print()
 i = 0
 # print(i, j)
 R = diag_opreation(k, i, Num_element, R, 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 实现方阵的对角线遍历示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Python数据结构之栈、队列的实现代码分享

Python数据结构之栈、队列的实现代码分享

1. 栈 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或...

用Python批量把文件复制到另一个文件夹的实现方法

0 前言 大概是三个月前,有个人找我说要我帮忙写几行代码,功能是把一个文件夹里面的所有文件拆分成 200 个文件一个文件夹,很简单的。 我理解了之后,觉得还是挺简单的,花了半个小时写出...

使用OpenCV实现仿射变换—缩放功能

使用OpenCV实现仿射变换—缩放功能

前面介绍怎么样实现平移的功能,接着下来演示缩放功能。比如在一个文档里插入一个图片,发现这个图片占用太大的面积了,要把它缩小,才放得下,与文字的比例才合适。这样的需求,就需要使用仿射变换的...

详解使用pymysql在python中对mysql的增删改查操作(综合)

详解使用pymysql在python中对mysql的增删改查操作(综合)

这一次将使用pymysql来进行一次对MySQL的增删改查的全部操作,相当于对前五次的总结: 先查阅数据库: 现在编写源码进行增删改查操作,源码为: #!/usr/bin/py...

手把手教你pycharm专业版安装破解教程(linux版)

手把手教你pycharm专业版安装破解教程(linux版)

1.首先到jetbrains下载专业版 https://www.jetbrains.com/pycharm/download/#section=linux 我这里下载的是pycharm-...