【问题标题】:How can I solve the of transpose of a matrix in single line in python?如何在python中解决单行矩阵的转置问题?
【发布时间】:2017-08-19 10:33:21
【问题描述】:

一个二维矩阵可以用 Python 逐行表示,作为一个列表列表:每个内部列表代表矩阵的一行。比如矩阵

1  2  3
4  5  6 

将表示为[[1,2,3],[4,5,6]]。

矩阵的转置使每一行变成一列。比如上面矩阵的转置是

1  4  
2  5
3  6

编写一个 Python 函数 transpose(m),该函数将使用此逐行表示的二维矩阵作为输入,并使用相同的表示返回矩阵的转置。

这里有一些例子来说明你的函数应该如何工作。你可以假设函数的输入总是一个非空矩阵。

>>> transpose([[1,4,9]])
[[1], [4], [9]]

>>> transpose([[1,3,5],[2,4,6]])
[[1,2], [3,4], [5,6]]
0 
>>> transpose([[1,1,1],[2,2,2],[3,3,3]])
[[1,2,3], [1,2,3], [1,2,3]]

【问题讨论】:

  • 一般来说,在 SO 的人们不介意帮助像你这样的学生完成作业。但我们实在太闲了,无法真正为您做它。就像你自己一样。
  • 看看内置的zip()函数。

标签: python matrix transpose


【解决方案1】:

这是一个很好的问题,为什么没有评分答案? 这是使用一些高级切片的理想案例:

def transpose(M):
    n = len(M[0])
    L = sum(M, [])
    return [L[i::n] for i in range(n)]

如果你需要速度,你应该使用itertools.chain而不是sum:

from itertools import chain

def transpose2(M):
    n = len(M[0])
    L = list(chain(*M))
    return [L[i::n] for i in range(n)]

我在一台旧 Mac(2011 年)上进行了一些测试,时间如下:
(transpose0 用于比较)

def transpose0(M):
    return [[M[j][i] for j in range (len(M))] for i in range (len(M[0]))]

5x5 matrix:
%timeit transpose(M):  2.67 µs µs ...
%timeit transpose2(M): 2.94 µs ...
%timeit transpose0(M): 6.96 µs ...

10x10 matrix:
%timeit transpose(M):   6.25 µs ...
%timeit transpose2(M):  5.83 µs ...
%timeit transpose0(M): 19.1 µs ...

100x100 matrix:
%timeit transpose(M):  2.11 ms ...
%timeit transpose2(M):  194 µs ...
%timeit transpose0(M): 1.21 ms ...

对于小于 7x7 的矩阵,sum 更快。对于更大的矩阵,您需要itertools.chain。但老实说,对于任何严肃的工作,我建议使用 numpy。

【讨论】:

  • 你能解释一下 sum(M, []) & [L[i::n] for i in range(n)] 它是如何工作的
【解决方案2】:
import math
def transpose(m):
 result=[[[m[j][i] for j in range (len(m))] for i in range (len(m[0]))]
 for r in result:
  print(r)

输出:

>>>transpose([[2,4,6],[7,8,9],[3,6,7]])
[[2,7,3],[4,8,6],[6,9,7]]

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案3】:
def transpose(m):
   rez = [[[m[j][i] for j in range(len(m))] for i in range(len(m[0]))]]
   for row in rez:
      print(row)

   transpose([[1,4,9]])

【讨论】:

  • 一些关于为什么这个工作会有帮助的额外的话。
  • 虽然这段代码可以回答问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅代码的答案可能会令人困惑且缺乏上下文。
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2011-06-23
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多