簡體   English   中英

堆疊多個 2D 數組以生成 3D 數組

[英]Stack several 2D arrays to produce a 3D array

我有 4 個 numpy 數組,每個數組的形狀為 (5,5)。 我想將它們堆疊起來,以便獲得一個新的形狀數組 (5,5,4)。 我嘗試使用:

N = np.stack((a, b, c, d))

但是,由於我是使用 numpy 的新手,我無法理解為什么它會給出 (4, 5, 5) 而不是 (5, 5, 4) 的形狀。 我應該使用另一種方法嗎? dstack 工作但改變了我的數組,我認為它轉置了它們。

例如,4個數組

[[1,2]
 [3,4]]

[[1,2]
 [3,4]]

[[1,2]
 [3,4]]

[[1,2]
 [3,4]]

堆疊時我期待:

[[[1,2]
 [3,4]]

[[1,2]
 [3,4]]

[[1,2]
 [3,4]]

[[1,2]
 [3,4]]]

這在堆棧中按預期工作,但會給出(4,2,2)而不是(2,2,4)的形狀。 根據我的理解,形狀是(行、列、深度)我錯了嗎?

我相信您可以連接數組,並將其重塑為 3D 數組:

l = [a,b,c,d]
np.concatenate(l).reshape(len(l), *a.shape)

或者,如果您想避免創建該列表並事先知道數組的數量:

np.concatenate((a,b,c,d)).reshape(4, *a.shape)

檢查共享示例:

a = [[1, 2], [3, 4]]
d = c = b = a

np.concatenate((a,b,c,d)).reshape(4, *np.array(a).shape)
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])
In [10]: arr = np.arange(1,5).reshape(2,2)
In [11]: np.stack((arr,arr,arr))
Out[11]: 
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])
In [12]: _.shape
Out[12]: (3, 2, 2)

默認stack在新的第一個軸上連接數組,與np.array((arr,arr,arr)).shape

如果給定一個axis參數,它可以將它們連接為:

In [13]: np.stack((arr,arr,arr), axis=2)
Out[13]: 
array([[[1, 1, 1],
        [2, 2, 2]],

       [[3, 3, 3],
        [4, 4, 4]]])
In [14]: _.shape
Out[14]: (2, 2, 3)

np.dstack做同樣的事情,其中d代表“深度”。

最后一個維度(此處為 3)顯示為最里面的列。

選擇一個“通道”會產生一個二維數組:

In [17]: np.stack((arr,arr,arr), axis=2)[:,:,0]
Out[17]: 
array([[1, 2],
       [3, 4]])

對於 3 個維度,第一個維度是塊或平面,中間的行。 這些名稱是方便的,幫助我們形象化動作,但在numpy沒有固有的意義。 對於圖像,最后一個維度通常稱為顏色或通道,大小為 3 或 4。圖像的 4d 數組可以描述為

(batches, height, width, color)

但實際含義取決於您如何處理數組。

暫無
暫無

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

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