拼接不會改變數組的維度,而堆疊會增加新的軸。
一,拼接
如果要把兩份數據組合到一起,需要拼接操作。
numpy.concatenate((a1, a2, ...), axis=0, out=None)
參數axis默認值是0,標識按照行來拼接,如果設置為None,那么所有的數組將展開為一維,並拼接在一起。
對二維數組進行拼接
x = np.array([[1, 2, 3], [4, 5, 6]]) y = np.array([[7, 8, 9], [10, 11, 12]]) z = np.concatenate([x, y], axis=0) print(z) # [[ 1 2 3] # [ 4 5 6] # [ 7 8 9] # [10 11 12]] z = np.concatenate([x, y], axis=1) print(z) # [[ 1 2 3 7 8 9] # [ 4 5 6 10 11 12]]
二,堆疊,沿着新加入數組
np.stack的作用是沿着新的軸堆疊一個數組:
- 沿新軸:默認是axis=0
- 加入數組是指:新生成的數組會比用來進行拼接的原數組多一個維度.
一維數組相當於是1行N列的數組,當使用column_stack()時,該一維數組作為一個新列;當使用hstack()函數時,為原始數組新增N列;當使用vstack()函數時,為原始數組新增1行。
1,把一維數組作為列添加到二維數組中
tup是一個數組的序列,按照列堆疊時,相當於二維數組新增一列;按照行堆疊時,相當於增加一列行:
numpy.column_stack(tup) numpy.row_stack(tup)
舉個例子,把兩個一維數組按照行/列堆疊成一個二維數組:
>>> a = np.array([1, 2, 3]) >>> b = np.array([4, 5, 6]) >>> np.row_stack((a,b)) array([[1, 2, 3], [4, 5, 6]]) >>> np.column_stack((a,b)) array([[1, 4], [2, 5], [3, 6]])
2,按維度堆疊數組
按列對原始數組進水平(horizontally ,column),垂直(vertically ,row)或者深度(depth,third asix)擴展,參數tup是數組的序列,參數axis表示沿着這個軸。
numpy.stack(arrays, axis=0)
numpy.hstack(tup)
numpy.vstack(tup)
numpy.dstack(tup)
舉個例子,分別對數組進行列堆疊、水平堆疊和垂直堆疊:
>>> a = np.array([1, 2, 3]) >>> b = np.array([4, 5, 6]) >>> np.vstack((a,b)) array([[1, 2, 3], [4, 5, 6]]) >>> np.hstack((a,b)) array([1, 2, 3, 4, 5, 6]) >>> np.dstack((a,b)) array([[[1, 4], [2, 5], [3, 6]]])
例子 1 ,對於兩個一維數組,堆疊之后,變成一個二維數組:
x = np.array([1, 2, 3]) y = np.array([7, 8, 9]) z = np.stack([x, y]) # axis=0 print(z.shape) # (2, 3) print(z) # [[1 2 3] # [7 8 9]] z = np.stack([x, y], axis=1) print(z.shape) # (3, 2) print(z) # [[1 7] # [2 8] # [3 9]]
解釋堆疊的過程:
- 沿着行來堆疊數組是指分別取出兩個數組的一行,作為新的一列;依次類推。
- 沿着列來堆疊數組是指分別取出兩個數組的一列,作為新的一行;依次類推。
例子2, 對於兩個二維數組進行堆疊,會變成一個三維數組。
x = np.array([[1, 2, 3], [4, 5, 6]]) y = np.array([[7, 8, 9], [10, 11, 12]]) z = np.stack([x, y], axis=0) print(z.shape) # (2,2,3) print(z) #[[[ 1 2 3] # [ 4 5 6]] # # [[ 7 8 9] # [10 11 12]]] z = np.stack([x, y], axis=1) print(z.shape) # (2, 2, 3) print(z) # [[[ 1 2 3] # [ 7 8 9]] # # [[ 4 5 6] # [10 11 12]]] z = np.stack([x, y], axis=2) print(z.shape) # (2, 3, 2) print(z) # [[[ 1 7] # [ 2 8] # [ 3 9]] # # [[ 4 10] # [ 5 11] # [ 6 12]]]
解釋堆疊的過程:可以把二維數組看作是“一維數組”,這個“一維數組”只有一行,列是一個數組。
舉例:新的一維數組只有兩個列:[ 1 2 3],[ 4 5 6],這兩列構成一行。
- 沿着行來堆疊數組的過程是:分別取出“一維數組”的行(行是一個二維數組),作為新的一行,堆疊在一起。
- 沿着列來堆疊數組的過程是:分別取出“一維數組”的列(列是一維數組級別),作為新的一行,堆疊在一起。
- 沿着深度類堆疊數組的過程是:分別取出“一維數組”的列的元素(元素級別),作為新的深度,堆疊在一起。
三,拆分
把一個數組拆分成一個或多個子數組,作為原始數組的視圖。
numpy.split(ary, indices_or_sections, axis=0) numpy.vsplit(ary, indices_or_sections) numpy.hsplit(ary, indices_or_sections)
參數注釋:
indices_or_sections:int或一維數組,
如果indexs_or_sections是整數N,則該數組將沿軸分為N個相等的數組。如果無法進行此類拆分,則會引發錯誤。
如果indexs_or_sections是一維有序的整數數組(數組的元素是特定的位置序號,即索引,從0開始),那么沿軸在相應的位置處拆分該數組。如果沿軸的索引超出數組的維數,那么將相應返回一個空的子數組。
x = np.array([[11, 12, 13, 14], [16, 17, 18, 19], [21, 22, 23, 24]]) y = np.split(x, [1, 3]) print(y) # [array([[11, 12, 13, 14]]), array([[16, 17, 18, 19], # [21, 22, 23, 24]]), array([], shape=(0, 4), dtype=int32)] y = np.split(x, [1, 3], axis=1) print(y) # [array([[11], # [16], # [21]]), array([[12, 13], # [17, 18], # [22, 23]]), array([[14], # [19], # [24]])]
參考文檔: