1

How do i achieve line 9 and 10 i.e the two for loops in python

matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
]

newMatrix = []

for (i=0; i < len(matrix); i++):
    for (j=0; j < len(matrix[i]); j++):
        newMatrix[j][i] = matrix[i][j]
print newMatrix

PS: i know i can do [[row[i] for row in matrix] for i in range(4)] but how i do only using for loops

4

4 回答 4

2

使用range(或xrange)。

for i in range(len(matrix)):
  for j in range(len(matrix[i])):

仅供参考,分配给newMatrix[i][j]将失败,因为newMatrix是一个空的list. 您需要为每一行添加一个新的空listnewMatrix,然后在每次迭代中将新值附加到该列表中。

于 2012-09-03T07:55:01.440 回答
1

您可以使用该enumerate()函数遍历两个矩阵值并为您提供索引:

newMatrix = [[0] * len(matrix) for _ in xrange(len(matrix[0]))]
for i, row in enumerate(matrix):
    for j, value in enumerate(row):
        newMatrix[j][i] = value

这输出:

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

因为您正在直接寻址新矩阵中的行和列,所以您需要先用空值初始化该新矩阵。我的示例第一行的列表理解为您执行此操作。给定一个大小为 ( x , y ) 的输入矩阵,它创建一个大小为 ( y , x ) 的新矩阵。

zip或者,您可以通过(ab)使用函数来完全避免显式循环:

newMatrix = zip(*matrix)

它采用每一行matrix并将这些行中的每一列分组为新行。

在一般情况下,pythonfor构造循环序列。range()andxrange()函数可以为您生成数字序列,这些生成数字序列的方式与 C 或 JavaScript 中的循环for生成的方式非常相似:

>>> for i in range(5):
>>>   print i,
0 1 2 3 4

但是该构造比 C 风格的for构造要强大得多。在大多数此类循环中,您的目标是为某个序列提供索引,python 构造绕过索引并直接转到序列中的值。

于 2012-09-03T07:57:22.150 回答
1

只是为了混合答案,如果您正在使用 Python 进行任何类型的矩阵运算,请考虑使用numpy

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

转置非常简单:

>>> matrix.transpose()
matrix([[ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11],
       [ 4,  8, 12]])
于 2012-09-03T08:12:46.807 回答
1

如果我理解正确,您想要做的是矩阵转置,可以通过以下方式完成:

 zip(*matrix)
于 2012-09-03T08:12:51.610 回答