我有一个 6x6 矩阵作为 python 中的列表列表。矩阵被分成 4 个大小为 3x3 的方 block 。我想要一种只转置 1 个 block 的方法。我可以使用传统方法遍历每个元素并将其复制到另一个数组并返回等等,但我想看看是否有更好的方法,(在 python 中转置矩阵可以在一行中使用压缩方法)
例如,这是矩阵及其 block 的表示
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
我想找到一种方法,它接受一个 block 号并只向左或向右旋转该 block 。有什么简单的方法吗?
最佳答案
基于 Sven Marnach 使用 np.rot90
的想法,这里有一个顺时针旋转象限的版本(按要求?)。在关键一步
block3[:] = np.rot90(block3.copy(),-1)
a copy()
用于右侧 (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]]
关于python - 在 python 中转置/旋转矩阵 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087485/