[英]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.