1

for9行目と10行目、つまりPythonの2つのループを実現するにはどうすればよいですか?

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:できることはわかっています[[row[i] for row in matrix] for i in range(4)]が、forループのみを使用する方法

4

4 に答える 4

2

range(または)を使用しxrangeます。

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

参考までに、は空であるため、への割り当てnewMatrix[i][j]は失敗します。すべての行に新しい空を追加してから、すべての反復でそのリストに新しい値を追加する必要があります。newMatrixlistlistnewMatrix

于 2012-09-03T07:55:01.440 に答える
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 に答える
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]]

新しいマトリックスの行と列を直接アドレス指定しているため、最初にその新しいマトリックスを空の値で初期化する必要があります。私の例の最初の行のリスト内包はあなたのためにこれを行います。サイズ(xy )の入力行列が与えられると、サイズが( yx )の新しい行列を作成します。

zipまたは、次の関数を(ab)使用することで、明示的なループを完全に回避できます。

newMatrix = zip(*matrix)

これは、の各行をmatrix取得し、それらの行の各列を新しい行にグループ化します。

一般的なケースでは、Pythonforはシーケンスのループを構築します。range()andxrange()関数は、数値シーケンスを生成できます。これらは、forCまたはJavaScriptのループが生成するのとほぼ同じ方法で数列を生成します。

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

しかし、この構成はCスタイルの構成よりもはるかに強力ですfor。ほとんどのそのようなループでは、あなたの目標はいくつかのシーケンスにインデックスを提供することです、pythonコンストラクトはインデックスをバイパスし、代わりにシーケンスの値に直接行きます。

于 2012-09-03T07:57:22.150 に答える