8

私はPythonのリストのリストとして6x6のマトリックスを持っています。マトリックスは、サイズ3x3の4つの正方形のブロックに分割されます。1ブロックだけ転置する方法が欲しいです。各要素を調べて別の配列にコピーしたり戻したりする従来の方法を使用してそれを行うことができますが、より良い方法があるかどうかを確認したいと思います(Pythonで行列を転置するには、 zip方式)

たとえば、これは行列とそのブロックの表現です

 block 1  block 2
+-------+-------+
| . . . | . . . |
| . . 2 | 1 . . |
| . . . | . . . |
+-------+-------+
| . . . | . . . |
| . . . | . . . |
| . 1 . | . . . |
+-------+-------+
 block 3  block 4

そしてrotate(3、right)はこれをもたらすはずです

 block 1  block 2
+-------+-------+
| . . . | . . . |
| . . 2 | 1 . . |
| . . . | . . . |
+-------+-------+
| . . . | . . . |
| 1 . . | . . . |
| . . . | . . . |
+-------+-------+
 block 3  block 4

ブロック番号を取り込んで、そのブロックだけを左右に回転させる方法を見つけたい。それを行う簡単な方法はありますか?

4

4 に答える 4

5

Sven Marnachの使用のアイデアに基づいてnp.rot90、象限を時計回りに回転させるバージョンがあります(要求に応じて?)。重要なステップで

block3[:] = np.rot90(block3.copy(),-1)

acopy()は右側(RHS)で使用されます。がないとcopy()、値がに割り当てられるためblock3、RHSで使用される基になるデータも変更されます。これにより、後続の割り当てで使用される値が混乱します。がない場合copy()、複数の同じ値が約に広がりますblock3

コピーなしでこの操作を行う方法がわかりません。

import numpy as np
a = np.arange(36).reshape(6, 6)
print(a)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]
#  [24 25 26 27 28 29]
#  [30 31 32 33 34 35]]
block3 = a[3:6, 0:3]

# To rotate counterclockwise
block3[:] = np.rot90(block3.copy())
print(a)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [20 26 32 21 22 23]
#  [19 25 31 27 28 29]
#  [18 24 30 33 34 35]]

# To rotate clockwise
a = np.arange(36).reshape(6, 6)
block3 = a[3:6, 0:3]
block3[:] = np.rot90(block3.copy(),-1)
print(a)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [30 24 18 21 22 23]
#  [31 25 19 27 28 29]
#  [32 26 20 33 34 35]]
于 2011-11-11T02:07:26.707 に答える
4

価値があるのは、NumPyでこれがいかに簡単かということです。

>>> a = numpy.arange(36).reshape(6, 6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])
>>> block3 = a[3:6, 0:3]
>>> block3[:] = numpy.rot90(block3, 1).copy()
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [20, 26, 32, 21, 22, 23],
       [26, 25, 31, 27, 28, 29],
       [20, 26, 20, 33, 34, 35]])
于 2011-11-10T23:49:43.320 に答える
0

マトリックスをブロックの辞書として定義し、ブロックをリストのリストとして定義することは解決策でしょうか?あなたの例では(transpose()を転置に使用する関数に置き換えてください):

Matrix={1:block1,2:block2,3:block3,4:block4}
block3=transpose(block3)
Matrix[3]=block3
于 2011-11-10T23:10:11.823 に答える
0

提供したマトリックスから「ブロック」を回転させる方法は次のとおりです。

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

def rotate(m, right):
    rm = []
    for i in range(0,len(m)):
        if right:
            rm.append([row[i] for row in reversed(m)])
        else:
            rm.append([row[i] for row in m])
    return rm

rightこれはBool
を返しますlist of lists

次のものも使用できます。

def rotate(m, right):
    if right:
        return list(zip(*reversed(m)))
    else:
        return list(zip(*m))

しかし、これはlist of tuples


編集:

タイプの行列について話している場合:

matrix = [[[1,2,3],[4,5,6],[7,8,9]], # block 1
          [[1,2,3],[4,5,6],[7,8,9]], # block 2
          [[1,2,3],[4,5,6],[7,8,9]], # block 3
          [[1,2,3],[4,5,6],[7,8,9]]  # block 4
         ]

を使用してブロック3にアクセスしますmatrix[2]

したがって、rotate関数は次のように使用されます。
rotate(matrix[2], True) #rotate block 3, right

于 2011-11-10T23:13:34.717 に答える