簡體   English   中英

Numpy:最后一維的堆棧數組

[英]Numpy: stack array by the last dimension

假設我有 3 個相同形狀的 numpy 數組a , b , c ,比如說

a.shape == b.shape == c.shape == (7,9)

現在我想創建一個大小為(7,9,3)的 3 維數組,比如x ,這樣

x[:,:,0] == a
x[:,:,1] == b
x[:,:,2] == c

這樣做的“pythonic”方式是什么(也許在一行中)?

提前致謝!

有一個函數可以做到這一點: numpy.dstack (“d”代表“深度”)。 例如:

In [10]: import numpy as np

In [11]: a = np.ones((7, 9))

In [12]: b = a * 2

In [13]: c = a * 3

In [15]: x = np.dstack((a, b, c))

In [16]: x.shape
Out[16]: (7, 9, 3)

In [17]: (x[:, :, 0] == a).all()
Out[17]: True

In [18]: (x[:, :, 1] == b).all()
Out[18]: True

In [19]: (x[:, :, 2] == c).all()
Out[19]: True

特爾;博士:

使用numpy.stack ( docs ),它沿着您選擇的新軸連接一系列數組。


盡管@NPE 的回答非常好並且涵蓋了很多情況,但在某些情況下numpy.dstack不是正確的選擇(我剛剛在嘗試使用它時發現了這一點)。 這是因為numpy.dstack ,根據文檔

按順序深度堆疊數組(沿第三軸)。

這等效於在形狀 (M,N) 的二維陣列被重新整形為 (M,N,1) 並且形狀 (N,) 的一維陣列被重新整形為 (1, N,1)。

讓我們來看一個不希望使用此函數的示例。 假設您有一個包含 512 個形狀為(3, 3, 3) numpy 數組的列表,並且想要將它們堆疊起來以獲得形狀為(3, 3, 3, 512)的新數組。 就我而言,這 512 個陣列是 2D 卷積層的過濾器。 如果您使用numpy.dstack

>>> len(arrays_list)
512
>>> arrays_list[0].shape
(3, 3, 3)
>>> numpy.dstack(arrays_list).shape
(3, 3, 1536)

那是因為numpy.dstack總是沿着第三個軸堆疊數組! 或者,您應該使用numpy.stack ( docs ),它沿着您選擇的新軸連接一系列數組:

>>> numpy.stack(arrays_list, axis=-1).shape
(3, 3, 3, 512)

就我而言,我將 -1 傳遞給axis參數,因為我希望數組沿最后一個軸堆疊。

暫無
暫無

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

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