[英]Numpy: reshaping of 2D array
給定以下輸入 numpy 形狀(n**2 * m, m)
數組,其中n=2
和m=5
:
A = np.array([[ 71.87, 47.8 , 24.84, 25.31, 15.43],
[ 174.8 , 131.84, 57.57, 76.53, 48.5 ],
[ 4.4 , 2. , 1.6 , 1. , 0. ],
[ 28.71, 15. , 10.5 , 4.17, 2.52],
[ 222.8 , 123.59, 7.72, -39.33, 4.65],
[ 156.84, 138.17, 21.75, 80.86, 44.55],
[ 89.5 , 133.01, -114.69, 1. , -167.7 ],
[ 21.25, 19.57, -177.65, 57.38, -119.75],
[ 162.33, 7.72, -51.72, 117.31, -87.87],
[ 77.57, 26.75, 36.64, 6.99, 25.97],
[ 276.6 , 275.31, -128.61, 105.7 , -86.5 ],
[ 135.5 , 232.67, 9.15, -5.25, -48.62],
[ 325.31, 238.17, -32.69, 41.55, 3.32],
[ 126.53, 118.36, -13.64, 104.64, 7.66],
[ 522.25, 176. , -338.05, 265.95, -411.87],
[ 16.67, 116.75, -255.25, 109.61, -397.18],
[ 15.43, 267.15, 159.63, 3.32, 30.31],
[ 48.5 , 83.93, 63.47, 17.66, 70.16],
[ 321.25, 213.55, 1. , 368.13, -261.55],
[ 107.52, 5.25, -89.25, 423.44, -80.89]])
如何重塑和置換A
的軸以獲得以下形狀(n*m, n*m)
的 output B
?
B = np.array([[ 71.87, 174.8 , 222.8 , 156.84, 162.33, 77.57, 325.31, 126.53, 15.43, 48.5 ],
[ 4.4 , 28.71, 89.5 , 21.25, 276.6 , 135.5 , 522.25, 16.67, 321.25, 107.52],
[ 47.8 , 131.84, 123.59, 138.17, 7.72, 26.75, 238.17, 118.36, 267.15, 83.93],
[ 2. , 15. , 133.01, 19.57, 275.31, 232.67, 176. , 116.75, 213.55, 5.25],
[ 24.84, 57.57, 7.72, 21.75, -51.72, 36.64, -32.69, -13.64, 159.63, 63.47],
[ 1.6 , 10.5 , -114.69, -177.65, -128.61, 9.15, -338.05, -255.25, 1. , -89.25],
[ 25.31, 76.53, -39.33, 80.86, 117.31, 6.99, 41.55, 104.64, 3.32, 17.66],
[ 1. , 4.17, 1. , 57.38, 105.7 , -5.25, 265.95, 109.61, 368.13, 423.44],
[ 15.43, 48.5 , 4.65, 44.55, -87.87, 25.97, 3.32, 7.66, 30.31, 70.16],
[ 0. , 2.52, -167.7 , -119.75, -86.5 , -48.62, -411.87, -397.18, -261.55, -80.89]])
這種轉換很容易使用for
循環完成,但由於我需要在這里高效,我正在尋找一個適當的基於reshape
的解決方案,並對其背后的邏輯進行一些澄清。
任何幫助將不勝感激。
仔細查看您的數據后發現,在 output 中, A
的列已被n*n
塊分塊並平鋪成n
x n
方塊。 因此,例如, B[:2, :2]
具有A[:4, 0]
的值。
因此,關鍵是嘗試將這些塊放入連續的維度,然后在最終重塑之前使用適當軸的轉置。
長話短說:
B = np.reshape(np.reshape(A.T, (m, m, n, n)).transpose(0, 2, 1, 3), (n*m, n*m))
您可以使用通常的reshape
、 swapaxes
、 reshape
來重新整形。 @divakar發布了詳細的解釋。
A.T.reshape(5,5,2,2).swapaxes(1,2).reshape(10,-1)
出去:
array([[ 71.87, 174.8 , 222.8 , 156.84, 162.33, 77.57, 325.31, 126.53, 15.43, 48.5 ],
[ 4.4 , 28.71, 89.5 , 21.25, 276.6 , 135.5 , 522.25, 16.67, 321.25, 107.52],
[ 47.8 , 131.84, 123.59, 138.17, 7.72, 26.75, 238.17, 118.36, 267.15, 83.93],
[ 2. , 15. , 133.01, 19.57, 275.31, 232.67, 176. , 116.75, 213.55, 5.25],
[ 24.84, 57.57, 7.72, 21.75, -51.72, 36.64, -32.69, -13.64, 159.63, 63.47],
[ 1.6 , 10.5 , -114.69, -177.65, -128.61, 9.15, -338.05, -255.25, 1. , -89.25],
[ 25.31, 76.53, -39.33, 80.86, 117.31, 6.99, 41.55, 104.64, 3.32, 17.66],
[ 1. , 4.17, 1. , 57.38, 105.7 , -5.25, 265.95, 109.61, 368.13, 423.44],
[ 15.43, 48.5 , 4.65, 44.55, -87.87, 25.97, 3.32, 7.66, 30.31, 70.16],
[ 0. , 2.52, -167.7 , -119.75, -86.5 , -48.62, -411.87, -397.18, -261.55, -80.89]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.