使用列表推导在Python中转置多维矩阵

时间:2013-01-25 14:50:45

标签: python matrix list-comprehension

我有一个Python分配,我必须转换一个多维矩阵(3x3,4x4,5x5 ......)而不使用任何for循环但只使用列表理解。

作为2x2矩阵的示例,我们有:

a2 = [[1, 2], [3, 4]]
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

但我不确定我是否真的了解它的工作原理或如何使其适应3x3,4x4,5x5 ......矩阵

例如,

a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

我不一定要你给我答案(仍然需要自己弄清楚),但任何提示都会非常有用!

提前致谢!

2 个答案:

答案 0 :(得分:6)

我很确定你已经在你的例子中有了它......

a2 = [[1, 2], [3, 4]]  #2x2
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

a2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]  #3x3
n = len(a2)
print [[row[i] for row in a2] for i in range(n)]

对象:

a3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

不是2x2,或3x3或4x4 - 它是2x2x2。您需要准确解释transpose对该数据结构的确切含义。

作为旁注,如果你没有将list-comprehension作为约束,那么使用Lattyware提出的zip是你应该这样做的方式 - 我只想指出您的解决方案已适用于NxN案例。

答案 1 :(得分:5)

有一个内置功能 - the zip() function

>>> list(zip(*[[1, 2], [3, 4]]))
[(1, 3), (2, 4)]

请注意,对list()的调用是显示结果,在3.x中,这会生成一个可迭代的,而不是一个列表(这是一个惰性,给予内存优势)。在2.x中,无论如何都会返回一个列表。

如果您想在具有更多嵌套列表的示例中转置内部部件,那么使用列表推导在子列表上运行zip()相对简单。

2.x中的示例以便于阅读:

>>> zip(*(zip(*part) for part in [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]))
[((1, 3), (5, 7)), ((2, 4), (6, 8))]