0x01 常用方法

其实咋说呢,如果使用numpy库的话倒是很简单就可以了,但是啥玩意都不用的话就稍微麻烦一点。

1.基础方法

  1. >>>a=[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
  2. >>>print([[row[i] for row in a] for i in range(len(a[0]))])
  3. [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
  1. >>>a=[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
  2. >>>print map(list,zip(*a))
  3. [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]

参考:http://www.revotu.com/matrix-transpose-in-python.html

2.numpy

  1. >>> a=[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
  2. >>> numpy.transpose(a)
  3. array([[ 1, 4, 7, 10],
  4. [ 2, 5, 8, 11],
  5. [ 3, 6, 9, 12]])

参考:https://blog.csdn.net/spcq4/article/details/52769919

0x02 矩阵转置经典题目

59. Spiral Matrix II

题目:

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:

  1. 输入: 3
  2. 输出:
  3. [
  4. [ 1, 2, 3 ],
  5. [ 8, 9, 4 ],
  6. [ 7, 6, 5 ]
  7. ]

解答

参考的答案里面给出了三种方法,下面来逐一进行分析:
方法一
当 n = 3 时,看一下螺旋矩阵的生成过程:

  1. || => |9| => |8| |6 7| |4 5| |1 2 3|
  2. |9| => |9 8| => |9 6| => |8 9 4|
  3. |8 7| |7 6 5|

初始矩阵为空,然后每次在顶部添加一行数据,在添加之前对原来的矩阵进行顺时针旋转。
按照这样的思路写的代码如下:

  1. class Solution(object):
  2. def generateMatrix(self, n):
  3. """
  4. :type n: int
  5. :rtype: List[List[int]]
  6. """
  7. A, lo = [], n**2+1
  8. while lo > 1:
  9. lo, hi = lo-len(A), lo #每次产生len(A)长度的顶部那行数据
  10. A = [range(lo, hi)] + zip(*A[::-1])
  11. return A
  1. # 这个的作用是对原来的矩阵进行顺时针的旋转
  2. a = zip(*A[::-1])