numpy 學習:數組的拼接、堆疊和拆分


拼接不會改變數組的維度,而堆疊會增加新的軸。

一,拼接

如果要把兩份數據組合到一起,需要拼接操作。

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]])]

 參考文檔:

 


免責聲明!

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



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