1 回答

TA貢獻1862條經驗 獲得超6個贊
我喜歡使用具有不同值和維度的示例數組,例如np.arange(24).reshape(2,3,4).
在這種情況下,我也查看了代碼。經過一些準備工作以確保axes和k正確后,它會根據 的 4 個可能值執行不同的操作k。
axes定義一個“平面”。對于 3d 陣列,axes=(0,1)可以將其視為繞第三軸 (2) 的旋轉,想象一個垂直于該“平面”的“矢量”。但代碼中使用的是這些軸值。雖然我懷疑我們可以使用基于三角的旋轉矩陣構造等效運算,但此代碼不執行任何計算。(請注意,整數不會更改為浮點數。)
k=0沒有改變任何內容:
In [104]: np.rot90(m,k=0, axes=(0,1))
Out[104]:
array([[[ 0, 1, 2, 3], # shape (2,3,4)
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
k=1涉及翻轉和轉置
In [105]: np.rot90(m,k=1, axes=(0,1))
Out[105]:
array([[[ 8, 9, 10, 11], # shape (3,2,4)
[20, 21, 22, 23]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 0, 1, 2, 3],
[12, 13, 14, 15]]])
k=2更簡單——只需在兩個軸上翻轉即可。這很容易想象。最后一個維度不變(跨行),但平面和行相反:
In [106]: np.rot90(m,k=2, axes=(0,1))
Out[106]:
array([[[20, 21, 22, 23],
[16, 17, 18, 19],
[12, 13, 14, 15]],
[[ 8, 9, 10, 11],
[ 4, 5, 6, 7],
[ 0, 1, 2, 3]]])
k=3先進行翻轉,然后進行轉置
In [107]: np.rot90(m,k=3, axes=(0,1))
Out[107]:
array([[[12, 13, 14, 15], # again (3,2,4)
[ 0, 1, 2, 3]],
[[16, 17, 18, 19],
[ 4, 5, 6, 7]],
[[20, 21, 22, 23],
[ 8, 9, 10, 11]]])
看看步伐:
In [111]: m.strides
Out[111]: (96, 32, 8)
In [112]: np.rot90(m,k=2, axes=(0,1)).strides
Out[112]: (-96, -32, 8) # the double flip
轉置會改變順序,而翻轉會再次改變符號:
In [113]: np.rot90(m,k=1, axes=(0,1)).strides
Out[113]: (-32, 96, 8)
In [114]: np.rot90(m,k=3, axes=(0,1)).strides
Out[114]: (32, -96, 8)
因為它只是使用flip并且transpose結果是view.
更簡單的 (1,3,4) 數組
在表示一個平面中的值的數組((3,4) 數組)中進行可視化可能更容易:
In [120]: m = np.arange(12).reshape(1,3,4)
In [121]: m
Out[121]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]])
In [122]: np.rot90(m,k=2, axes=(1,2))
Out[122]:
array([[[11, 10, 9, 8],
[ 7, 6, 5, 4],
[ 3, 2, 1, 0]]])
In [123]: np.rot90(m,k=1, axes=(1,2)) # visualize a counterclockwise rotation
Out[123]:
array([[[ 3, 7, 11],
[ 2, 6, 10],
[ 1, 5, 9],
[ 0, 4, 8]]])
In [124]: np.rot90(m,k=3, axes=(1,2)) # clockwise
Out[124]:
array([[[ 8, 4, 0],
[ 9, 5, 1],
[10, 6, 2],
[11, 7, 3]]])
k=3也可以看作是通過 1 和 2 連續逆時針旋轉。
添加回答
舉報