簡體   English   中英

Numpy:二維數組的整形

[英]Numpy: reshaping of 2D array

給定以下輸入 numpy 形狀(n**2 * m, m)數組,其中n=2m=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))

您可以使用通常的reshapeswapaxesreshape來重新整形。 @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM