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 # 创建两个一维数组 array1 = np.array([1, 2, 3]) array2 = np.array([4, 5, 6]) # 沿默认轴(axis=0)连接 result = np.concatenate((array1, array2)) print("连接后的数组:", result)
结果数组是一个包含两个输入数组所有元素的单个一维数组 -
连接数组:[1 2 3 4 5 6]
示例:沿不同轴连接二维数组
这里,我们使用 NumPy 中的 concatenate() 函数沿不同轴连接两个二维数组 -
import numpy as np # 创建两个二维数组 array1 = np.array([[1, 2], [3, 4]]) array2 = np.array([[5, 6], [7, 8]]) # 沿轴 0 连接(按行) result_axis_0 = np.concatenate((array1, array2), axis=0) print("沿轴 0 连接: ", result_axis_0) # 沿轴 1 连接(按列) result_axis_1 = np.concatenate((array1, array2), axis=1) print("沿轴 1 连接: ", result_axis_1)
以下是获得的输出 -
沿轴 0 连接: [[1 2] [3 4] [5 6] [7 8]] 沿轴 1 连接: [[1 2 5 6] [3 4 7 8]]
示例:连接不同维度的数组
在这里,我们将一维数组"array1"重塑为具有给定形状的二维数组,使其能够沿轴"0"与二维数组"array2"连接 -
import numpy as np # 创建一维数组和二维数组 array1 = np.array([1, 2, 3]) array2 = np.array([[4, 5, 6], [7, 8, 9]]) # 重塑 array1 使其变为二维数组,以便沿轴 0 连接 array1_reshaped = array1.reshape(1, -1) # 沿轴 0 连接 result = np.concatenate((array1_reshaped, array2), axis=0) print("连接数组: ", result)
这将产生以下结果 -
连接数组: [[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 # 创建两个二维数组 array1 = np.array([[1, 2], [3, 4]]) array2 = np.array([[5, 6], [7, 8]]) # 沿新的第三轴(轴 2)堆叠 stacked_array = np.stack((array1, array2), axis=2) print("沿轴 2 堆叠的数组: ", stacked_array) print("堆叠数组的形状:", stacked_array.shape)
新的维度表示数组的深度,原始数组中的相应元素将堆叠在一起 -
沿轴 2 堆叠的数组: [[[1 5] [2 6]] [[3 7] [4 8]]] 堆叠数组的形状:(2, 2, 2)
示例:堆叠多个数组
在此示例中,使用 stack() 函数沿新的第一个轴堆叠三个一维数组 -
import numpy as np # 创建三个一维数组 array1 = np.array([1, 2, 3]) array2 = np.array([4, 5, 6]) array3 = np.array([7, 8, 9]) # 沿第一个轴(新轴)堆叠0) stacked_array = np.stack((array1, array2, array3), axis=0) print("堆叠数组: ", stacked_array) print("堆叠数组的形状:", stacked_array.shape)
结果是一个二维数组,其中每个原始数组在新数组中构成一行 -
堆叠数组: [[1 2 3] [4 5 6] [7 8 9]] 堆叠数组的形状:(3, 3)
使用 hstack() 函数进行水平堆叠
NumPy 的 hstack() 函数按列顺序水平堆叠数组。这意味着数组会沿其第二维(二维数组的轴 1)连接。对于一维数组,它们只是沿单个可用轴连接。
语法如下:
np.hstack((array1, array2, ...))
其中,array1, array2, ... 是要水平堆叠的数组序列。所有数组除第二个轴外,其他所有轴的形状都必须相同。
示例
在下面的示例中,我们将两个二维数组"array1"和"array2"水平堆叠,从而生成一个新数组,其中"array2"的列位于"array1"列的右侧 -
import numpy as np # 创建两个二维数组 array1 = np.array([[1, 2, 3], [4, 5, 6]]) array2 = np.array([[7, 8, 9], [10, 11, 12]]) # 水平堆叠数组 hstacked_array = np.hstack((array1, array2)) print("水平堆叠的二维数组: ", hstacked_array)
以下是上述代码的输出 -
水平堆叠的二维数组: [[ 1 2 3 7 8 9] [ 4 5 6 10 11 12]]
使用 vstack() 函数进行垂直堆叠
NumPy 的 vstack() 函数按行方向按顺序堆叠数组。这意味着数组沿其第一维(二维数组的 0 轴)连接。对于一维数组,它们被视为行并堆叠在一起,从而形成二维数组。
语法如下:-
np.vstack((array1, array2, ...))
其中,array1, array2, ... 是要垂直堆叠的数组序列。除第一个轴外,所有数组的形状都必须相同。
示例
在以下示例中,我们将两个二维数组"array1"和"array2"垂直堆叠,从而生成一个新数组,其中"array2"的行位于"array1"行的下方 -
import numpy as np # 创建两个二维数组 array1 = np.array([[1, 2, 3], [4, 5, 6]]) array2 = np.array([[7, 8, 9], [10, 11, 12]]) # 垂直堆叠数组 vstacked_array = np.vstack((array1, array2)) print("垂直堆叠的二维数组: ", vstacked_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 # 垂直堆叠两个数组 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_arrays = np.vsplit(vstacked_array, 2) print("拆分数组:") for arr in split_arrays: print(arr)
执行上述代码后,我们得到以下输出 -
拆分数组: [[1 2 3] [4 5 6]] [[ 7 8 9] [10 11 12]]