灵活操作多维矩阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了灵活操作多维矩阵相关的知识,希望对你有一定的参考价值。

今天这一题是“贪吃蛇”:

给定一个NxN矩阵,从[0][0]开始沿顺时针方向遍历所有元素。如:

1 2 3

8 9 4

7 6 5

这样一个矩阵,最终的遍历打印输出为 1 2 3 4 5 6 7 8 9。

如何做到呢?

这个遍历其实是不断打印某个矩阵的四条边。老老实实的研究出各条边的起止index规律然后打印出来诚然可以,但是还有一个更简单的方法:

继续观察:

1. 打印第一条边 1 2 3,实际上是原始矩阵的第一行。

 

2. 接下来打印的第二条边 4 5, 是矩阵:

4 5

9 6

8 7

的第一行。而这个矩阵,是去掉第一条边后剩下的矩阵:

8 9 4

7 6 5

的转置矩阵的按行倒序。

 

3. 第三条边 6 7,是矩阵:

6 7

9 8

的第一行。这个矩阵,又是去掉第二条边后剩下的矩阵:

9 6

8 7

的转置矩阵的按行倒序。

 

4. 依次类推…

实现要点:

1. 去掉多维矩阵的第一行:

用list.pop()。

2. 矩阵的转置:

用zip(*原矩阵)。

3. 矩阵的按行倒序:

用list.reverse()。

相应的代码为:

def snail(array):
    a = []
    while array:
        a.extend(list(array.pop(0)))
        array = zip(*array)
        array.reverse()
    return a

zip和list真是矩阵处理的好帮手。

以上是关于灵活操作多维矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Matlab的多维数组操作

二维及多维数组的存储原理及寻址方式;矩阵的存储及基本操作;三元组表和十字链表存储的稀疏矩阵的基本操作

如何进行快速的多维矩阵向量乘法?

matlab_矩阵的灵活操作

多维数组和矩阵----基础训练

一个关于tensorflow中多维矩阵乘积的问题