numpy數組的拼接(擴維拼接和非擴維拼接)


hstack, vstack, dstack, concatenate, stack這些函數都可以用來拼接Numpy數組。還可以利用list來拼接數組。
對於拼接的效果其實我們可以划分為2類:

橫向拼接:hstack, vstack, concatenate等。橫向拼接的意思是指,拼接不會產生更高的維度。比如兩個2x2的二維矩陣拼接以后,它還是一個二維矩陣,只是變胖了,變成4x2或者2x4。
擴維拼接:dstack, stack等。拼接后會產生更高的維度,兩個(2, 2)的二維矩陣拼接會產生(2, 2, 2)的三維矩陣。
1. 水平拼接hstack

np.hstack()
1
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.hstack((a, b))
print(c)
print(c.shape)
1
2
3
4
5
6
輸出為:

array([[1, 1, 2, 2],
[1, 1, 2, 2]])
(2, 4)
1
2
3
2. 垂直拼接數組vstack

np.vstack()
1
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.vstack((a, b))
print(c)
print(c.shape)
1
2
3
4
5
6
輸出為:

array([[1, 1],
[1, 1],
[2, 2],
[2, 2]])
(4, 2)
1
2
3
4
5
3.深度拼接dstack

np.dstack()
1
import numpy as np
a = np.array([1, 2], [3, 4])
b = np.array([5, 6], [7, 8])
c = np.dstack((a, b))
print(c)
print(c.shape)
1
2
3
4
5
6
輸出為:

array([[[1, 5],
[2, 6]],

[[3, 7],
[4, 8]]])
(2, 2, 2)
1
2
3
4
5
6
4.concatenate()函數拼接
concatenate()是非常靈活的拼接函數。

np.concatenate()
1
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.concatenate((a, b), axis=0)
print(c)
print(c.shape)
1
2
3
4
5
6
輸出為:

array([[1, 1],
[1, 1],
[2, 2],
[2, 2]])
(4, 2)
1
2
3
4
5
可見axis=0時,concatenate的功能和vstack一樣。axis=0的含義就是,在第0個維度擴展,其他維度保持不變。這里的第0個維度之前是2,現在是4。
而axis=1時,輸出為:

array([[1, 1, 2, 2],
[1, 1, 2, 2]])
(2, 4)
1
2
3
可見axis=1時,concatenate的功能和hstack一樣。
注意,axis的取值只能小於被拼接數組的維度(2),所以axis在這里只能取0和1。
但對於多維數組的拼接,concatenate就十分方便了。

5.利用list來實現擴維拼接
我們先構建一個空list

import numpy as np
ls = []
a = np.array([[1, 1],[1, 1]])
b = np.array([[2, 2],[2, 2]])
ls.append(a)
ls.append(b)
c = np.array(ls)
print(c)
print(c.shape)
1
2
3
4
5
6
7
8
9
輸出為:

array([[[1, 1],
[1, 1]],

[[2, 2],
[2, 2]]])
(2, 2, 2)
1
2
3
4
5
6
注意,這一操作和dstack是有不同之處的。這個操作是將兩個數組疊放在一起而已。

6. 用stack來拼接數組
我們知道stack是擴維拼接,和concatenate有本質的區別。對於兩個(2, 2)的數組用stack拼接,我們的結果一定是個三維的,而concatenate的結果是二維的。
涉及到數組的擴維,我們就可以從維度上來理解stack的操作了,初始為2個shape為(2,2)的矩陣,擴展之后:
如果axis = 0,得出結果的shape應該是(_, 2, 2)。看清楚 下划線沒有,這個位置的維度是虛位以待的,如果有n(n>=2)個矩陣來拼接,這個下划線的數值就應該是n;(在本博文的栗子里,n=2)
如果axis=1,結果應該是(2, _, 2),在第1個維度上虛位以待;
如果axis=2,結果應該是(2, 2, _),在第2個維度上虛位以待;

np.stack()
1
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.stack((a, b), axis=0)
print(c)
print(c.shape)
1
2
3
4
5
6
輸出為:

array([[[1, 1],
[1, 1]],

[[2, 2],
[2, 2]]])
(2, 2, 2)
1
2
3
4
5
6
當axis=0時,np.stack就可以實現list一樣功能的擴維拼接。
再來看axis=1:
為了更容易看到效果,把兩個數組的值改一下:

import numpy as np
a = np.array([1, 2], [3, 4])
b = np.array([5, 6], [7, 8])
c = np.stack((a, b), axis=0)
print(c)
print(c.shape)
1
2
3
4
5
6
array([[[1, 2],
[5, 6]],

[[3, 4],
[7, 8]]])
(2, 2, 2)
1
2
3
4
5
6
再看當axis=2時,

array([[[1, 5],
[2, 6]],

[[3, 7],
[4, 8]]])
(2, 2, 2)
1
2
3
4
5
6
可見,axis=2時,stack和dstack的效果一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM