8

我有一个 6x6 矩阵作为 python 中的列表列表。矩阵分为 4 个大小为 3x3 的正方形块。我想要一种只转置一个块的方法。我可以使用遍历每个元素并将其复制到另一个数组并返回等等的传统方法来做到这一点,但我想看看是否有更好的方法,(在 python 中转置矩阵可以使用邮编方式)

例如,这是矩阵及其块的表示

 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

rightis aBool
这将返回一个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
         ]

您将通过使用访问块 3matrix[2]

所以旋转功能将像这样使用:
rotate(matrix[2], True) #rotate block 3, right

于 2011-11-10T23:13:34.717 回答