有没有一种快速的方法在Python中对矩形2D矩阵进行转置(不涉及任何库导入)?
比如,如果我有一个数组:
我需要一个数组Y,它应该是X的转置版本,因此:
比如,如果我有一个数组:
X=[ [1,2,3],
[4,5,6] ]
我需要一个数组Y,它应该是X的转置版本,因此:
Y=[ [1,4],
[2,5],
[3,6] ]
简单易懂: Y=zip(*X)
>>> X=[[1,2,3], [4,5,6]]
>>> Y=zip(*X)
>>> Y
[(1, 4), (2, 5), (3, 6)]
编辑: 为了回答评论中关于zip(*X)是什么意思的问题,以下是来自Python手册的示例:
>>> range(3, 6) # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # call with arguments unpacked from a list
[3, 4, 5]
因此,当X
为[[1,2,3],[4,5,6]]
时,zip(*X)
就是zip([1,2,3],[4,5,6])
zip(*X)
而不是zip(X)
?抱歉我是Python新手。我知道zip(X)
不能正常工作,但我不明白为什么。 - mr popo*
是解包语法。请参阅:http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists - Xavier Ho>>> X = [1,2,3], [4,5,6]]
>>> zip(*X)
[(1,4), (2,5), (3,6)]
>>> [list(tup) for tup in zip(*X)]
[[1,4], [2,5], [3,6]]
izip()
作为第二个参数,它可能会更快。 :] - Xavier Hozip
形式实际上会更快,尽管需要更多的内存。无论如何,玩弄这两个选项并不是提高此操作性能的方法。 - Mike Grahamrange()
通常比xrange()
慢,因为分配内存需要时间。虽然我不能确定列表推导式是否有任何优化,但我能给出的最好跟进评论是进行性能分析 - 这是唯一找出答案的方法。 - Xavier Hoizip()
开始胜出。因此,如果大多数矩阵输入的维度小于该值,则zip()
非常好用。(Python 2.6.5) - Xavier Ho>>> x = [[1,2,3], [4,5,6]]
>>> x = numpy.array(x)
>>> x
array([[1, 2, 3],
[4, 5, 6]])
>>> x.T
array([[1, 4],
[2, 5],
[3, 6]])