NumPy - 陣列連線



NumPy 中的陣列連線

NumPy 中的陣列連線是指將兩個或多個數組組合成單個數組的過程。結果可能因陣列的維度和連線陣列的軸而異。

NumPy 提供了多個函式用於沿不同軸連線陣列,它們是:

  • np.concatenate() 函式
  • np.stack() 函式
  • np.hstack() 函式
  • np.vstack() 函式

使用 concatenate() 函式

NumPy 的 concatenate() 函式沿指定的軸連線一系列陣列。除了要連線的軸對應的維度外,這些陣列必須具有相同的形狀。以下是基本語法:

np.concatenate((array1, array2, ...), axis=0)

其中,

  • array1, array2, ... − 要連線的陣列序列。除了由 axis 指定的一個軸外,這些陣列沿所有軸都應該具有相同的形狀。
  • axis − 沿其連線陣列的軸。預設值為 0,表示沿行連線陣列(對於二維陣列)。

示例:連線一維陣列

在下面的示例中,我們沿預設軸(axis 0)連線兩個一維陣列“array1”和“array2”:

import numpy as np

# Create two 1D arrays
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

# Concatenate along the default axis (axis=0)
result = np.concatenate((array1, array2))

print("Concatenated Array:", result)

生成的陣列是一個包含兩個輸入陣列所有元素的單個一維陣列:

Concatenated Array: [1 2 3 4 5 6]

示例:沿不同軸連線二維陣列

在這裡,我們使用 concatenate() 函式沿不同的軸連線兩個二維陣列:

import numpy as np

# Create two 2D arrays
array1 = np.array([[1, 2], [3, 4]])
array2 = np.array([[5, 6], [7, 8]])

# Concatenate along axis 0 (row-wise)
result_axis_0 = np.concatenate((array1, array2), axis=0)

print("Concatenated along Axis 0:\n", result_axis_0)

# Concatenate along axis 1 (column-wise)
result_axis_1 = np.concatenate((array1, array2), axis=1)

print("Concatenated along Axis 1:\n", result_axis_1)

獲得的輸出如下:

Concatenated along Axis 0:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
Concatenated along Axis 1:
 [[1 2 5 6]
 [3 4 7 8]]

示例:連線不同維度的陣列

在這裡,我們將一維陣列“array1”重塑為具有給定形狀的二維陣列,使其能夠沿軸“0”與二維陣列“array2”連線:

import numpy as np

# Create a 1D and a 2D array
array1 = np.array([1, 2, 3])
array2 = np.array([[4, 5, 6], [7, 8, 9]])

# Reshape array1 to make it 2D for concatenation along axis 0
array1_reshaped = array1.reshape(1, -1)

# Concatenate along axis 0
result = np.concatenate((array1_reshaped, array2), axis=0)

print("Concatenated Array:\n", result)

這將產生以下結果:

Concatenated Array:
[[1 2 3]
 [4 5 6]
 [7 8 9]]

使用 stack() 函式堆疊陣列

NumPy 的 stack() 函式沿一個新的軸連線一系列陣列,這個軸由你指定。當需要保留陣列的原始維度同時新增一個新軸進行堆疊時,此函式非常有用。以下是語法:

np.stack((array1, array2, ...), axis=0)

其中,

  • array1, array2, ... − 要堆疊的陣列序列。這些陣列必須具有相同的形狀。
  • axis − 沿其堆疊陣列的軸。預設值為 0,表示沿新的第一個軸堆疊陣列。

示例:堆疊二維陣列

在下面的示例中,我們沿新的第三軸堆疊兩個二維陣列。這將建立一個具有特定形狀的三維陣列:

import numpy as np

# Create two 2D arrays
array1 = np.array([[1, 2], [3, 4]])
array2 = np.array([[5, 6], [7, 8]])

# Stack along a new third axis (axis 2)
stacked_array = np.stack((array1, array2), axis=2)

print("Stacked Array along Axis 2:\n", stacked_array)
print("Shape of Stacked Array:", stacked_array.shape)

新維度表示陣列的深度,其中來自原始陣列的對應元素堆疊在一起:

Stacked Array along Axis 2:
[[[1 5]
  [2 6]]

 [[3 7]
  [4 8]]]
Shape of Stacked Array: (2, 2, 2)

示例:堆疊多個數組

在這個例子中,三個一維陣列使用 stack() 函式沿新的第一個軸堆疊:

import numpy as np

# Create three 1D arrays
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
array3 = np.array([7, 8, 9])

# Stack along the first axis (new axis 0)
stacked_array = np.stack((array1, array2, array3), axis=0)

print("Stacked Array:\n", stacked_array)
print("Shape of Stacked Array:", stacked_array.shape)

結果是一個二維陣列,其中每個原始陣列構成新陣列中的一行:

Stacked Array:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
Shape of Stacked Array: (3, 3)

使用 hstack() 函式進行水平堆疊

NumPy 的 hstack() 函式按順序水平(列式)堆疊陣列。這意味著陣列沿它們的第二維(二維陣列的 axis 1)連線。對於一維陣列,它們只是沿著單個可用軸連線。

以下是語法:

np.hstack((array1, array2, ...))

其中,array1, array2, ... 是要水平堆疊的陣列序列。所有陣列除了第二個軸外,沿所有軸都必須具有相同的形狀。

示例

在下面的示例中,我們將兩個二維陣列“array1”和“array2”水平堆疊,得到一個新陣列,其中“array2”的列放在“array1”的列右側:

import numpy as np

# Create two 2D arrays
array1 = np.array([[1, 2, 3],
                   [4, 5, 6]])
array2 = np.array([[7, 8, 9],
                   [10, 11, 12]])

# Horizontally stack the arrays
hstacked_array = np.hstack((array1, array2))

print("Horizontally Stacked 2D Array:\n", hstacked_array)

以上程式碼的輸出如下:

Horizontally Stacked 2D Array:
 [[ 1  2  3  7  8  9]
  [ 4  5  6 10 11 12]]

使用 vstack() 函式進行垂直堆疊

NumPy 的 vstack() 函式按順序垂直(行式)堆疊陣列。這意味著陣列沿它們的第一個維度(二維陣列的 axis 0)連線。對於一維陣列,它們被視為行並彼此堆疊,從而產生一個二維陣列。

以下是語法:

np.vstack((array1, array2, ...))

其中,array1, array2, ... 是要垂直堆疊的陣列序列。所有陣列除了第一個軸外,沿所有軸都必須具有相同的形狀。

示例

在下面的示例中,我們將兩個二維陣列“array1”和“array2”垂直堆疊,得到一個新陣列,其中“array2”的行放在“array1”的行下方:

import numpy as np

# Create two 2D arrays
array1 = np.array([[1, 2, 3],
                   [4, 5, 6]])
array2 = np.array([[7, 8, 9],
                   [10, 11, 12]])

# Vertically stack the arrays
vstacked_array = np.vstack((array1, array2))

print("Vertically Stacked 2D Array:\n", vstacked_array)

獲得的輸出如下所示:

Vertically Stacked 2D Array:
 [[ 1  2  3]
  [ 4  5  6]
  [ 7  8  9]
  [10 11 12]]

連線後分割陣列

連線陣列後,您可能希望將其分割回原始部分或不同形狀的部分。NumPy 提供了多個用於分割陣列的函式:

  • np.split() 函式 − 根據索引或部分將陣列分割成多個子陣列。
  • np.array_split() 函式 − 類似於 np.split() 函式,但允許分割成不相等的子陣列。
  • np.hsplit() 函式 − 水平(列式)分割陣列。
  • np.vsplit() 函式 − 垂直(行式)分割陣列。
  • np.dsplit() 函式 − 沿第三軸(深度方向)分割陣列,用於三維陣列。
陣列分割是將陣列分成多個子陣列的過程。此操作是陣列連線的反向操作。

示例

在下面的示例中,我們使用 np.vsplit() 函式將垂直堆疊的陣列分成兩等份,有效地反轉了垂直堆疊操作:

import numpy as np

# Vertically stack two arrays
array1 = np.array([[1, 2, 3],
                   [4, 5, 6]])
array2 = np.array([[7, 8, 9],
                   [10, 11, 12]])

vstacked_array = np.vstack((array1, array2))

# Split the array back into the original arrays
split_arrays = np.vsplit(vstacked_array, 2)

print("Split Arrays:")
for arr in split_arrays:
   print(arr)

執行上述程式碼後,我們得到以下輸出:

Split Arrays:
[[1 2 3]
 [4 5 6]]
[[ 7  8  9]
 [10 11 12]]
廣告