簡體   English   中英

將3D Numpy陣列重塑為2D陣列

[英]Reshaping 3D Numpy Array to a 2D array

我在Numpy中具有以下3D陣列:

a = np.array([[[1,2],[3,4]], [[5,6],[7,8]], [[9,10],[11,12]],[[13,14],[15,16]]])

當我寫

b = np.reshape(a, [4,4])

二維結果數組看起來像

 [[ 1  2  3  4]
  [ 5  6  7  8]
  [ 9 10 11 12]
  [13 14 15 16]]

但是,我希望它具有以下形狀:

 [[ 1  2  5  6]
  [ 3  4  7  8]
  [ 9 10 13 14]
  [11 12 15 16]]

如何在Python / Numpy中有效地做到這一點?

重新塑形以將第一根軸拆分為兩個置換軸,再進行一次塑形-

a.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
a.reshape(2,2,2,2).swapaxes(1,2).reshape(4,4)

使其通用,將成為-

m,n,r = a.shape
out = a.reshape(m//2,2,n,r).swapaxes(1,2).reshape(-1,2*r)

樣品運行-

In [20]: a
Out[20]: 
array([[[ 1,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]],

       [[ 9, 10],
        [11, 12]],

       [[13, 14],
        [15, 16]]])

In [21]: a.reshape(2,2,2,2).swapaxes(1,2).reshape(4,4)
Out[21]: 
array([[ 1,  2,  5,  6],
       [ 3,  4,  7,  8],
       [ 9, 10, 13, 14],
       [11, 12, 15, 16]])

僅使用np.hstacknp.vstack另一種方法:

In [98]: a
Out[98]: 
array([[[ 1,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]],

       [[ 9, 10],
        [11, 12]],

       [[13, 14],
        [15, 16]]])

In [99]: s0, s1, s2, s3 = range(a.shape[0])

In [100]: np.vstack((np.hstack((a[s0], a[s1])), np.hstack((a[s2], a[s3]))))
Out[100]: 
array([[ 1,  2,  5,  6],
       [ 3,  4,  7,  8],
       [ 9, 10, 13, 14],
       [11, 12, 15, 16]])

意識到您的目標是將原始數組的前兩個切片壓縮為一個切片,然后將第二個切片壓縮為另一個切片,依此類推。

如果您擔心性能,也可以用最快的表親np.concatenate替換np.vstacknp.hstack

PS:這種方法會創建一個新數組,而原來的數組保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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